找出有序數組中絕對值最小的元素

給定一個有序整數序列(非遞減序),可能包含負數,找出其中絕對值最小的元素,比如給定序列 -5, -3, -1, 2, 8 則返回-1。

思路:

由於給定序列是有序的,而這又是搜索問題,所以首先想到二分搜索法,只不過這個二分法比普通的二分法稍微麻煩點,可以分爲下面幾種情況

  • 如果給定的序列中所有的數都是正數,那麼數組的第一個元素即是結果。
  • 如果給定的序列中所有的數都是負數,那麼數組的最後一個元素即是結果。
  • 如果給定的序列中既有正數又有負數,那麼絕對值得最小值一定出現在正數和負數的連接處。
代碼如下:


#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define true 1
#define false 0

int 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;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章