給定一個有序整數序列(非遞減序),可能包含負數,找出其中絕對值最小的元素,比如給定序列 -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;
}