找出有序数组中绝对值最小的元素

来源:互联网 发布:淘宝卖返利商品处罚 编辑:程序博客网 时间:2024/05/06 06:55

给定一个有序整数序列(非递减序),可能包含负数,找出其中绝对值最小的元素,比如给定序列 -5, -3, -1, 2, 8 则返回-1。

思路:

由于给定序列是有序的,而这又是搜索问题,所以首先想到二分搜索法,只不过这个二分法比普通的二分法稍微麻烦点,可以分为下面几种情况

  • 如果给定的序列中所有的数都是正数,那么数组的第一个元素即是结果。
  • 如果给定的序列中所有的数都是负数,那么数组的最后一个元素即是结果。
  • 如果给定的序列中既有正数又有负数,那么绝对值得最小值一定出现在正数和负数的连接处。
代码如下:


#include <stdio.h>#include <math.h>#include <stdlib.h>#define true 1#define false 0int SameSign(int a, int b){    if (a * b > 0)        return true;    else        return false;}// 找出一个非递减序整数序列中绝对值最小的数int MinimumAbsoluteValue(int* a, int n){    // Only one number in array    if (n == 1)    {        return a[0];    }        // All numbers in array have the same sign    if (SameSign(a[0], a[n-1]))    {        return (a[0]>=0)? a[0] : a[n-1] ;    }        // Binary search    int l = 0 ;    int r = n-1 ;        while(l < r)    {        if (l + 1 == r)        {            return abs(a[l]) < abs(a[r]) ? a[l] : a[r] ;        }                int m = (l + r) /2 ;                if (SameSign(a[m], a[r]))        {            r = m;        }        else        {            l = m ;        }    }    return -1;}int main(int argc, const char * argv[]){    int a[5] = {-3,-2,-1,5,6};    printf("%d\n",MinimumAbsoluteValue(a, 5));    return 0;}




0 0
原创粉丝点击