假設陣列是從小到大排序,數值可能為負數、0、正數。
思路一
可以一次性遍歷一遍,找出絕對值最小值,此時時間複雜度為o(n),缺點是沒有利用陣列是有序的這一特點。
思路二
陣列有序,可以利用二分查詢的特性。中間的數是正數,往後找;中間的數是負數,往前找。
問題的本質是找到正數的最小值,或負數的最大值,分析以下集中情況
陣列為a, 陣列大小為n.
參考**
#include #include結果using
namespace
std;
int absmin(int *a, int
size)
}}int
main()
; size_t size1 = sizeof(arr1) / sizeof(int
);
int minabs1 =absmin(arr1, size1);
cout
<< "
result:
"<< minabs1 <
int arr2 = ;
size_t size2 = sizeof(arr2) / sizeof(int
);
int minabs2 =absmin(arr2, size2);
cout
<< "
result:
"<< minabs2 <
}
複雜度分析
時間複雜度o(log2n),空間複雜度o(1).
改進1:完全可以把這些特例(size=1、同號,放到while迴圈裡)
int absmin(int *a, int拓展size)
cout << "error, size <= 0" << endl;
return -1; //
size <= 0
}
有序(自小到達)絕對值最大呢?
如果有整數、0、負數的話,絕對值最小值在相對中間部位。但是如果求絕對值最大,絕對在兩邊,例如
1 2 3 4
-4 -3 -2 -1
-4 -2 0 1 2
因此只需比較邊上的兩個值的絕對值大小,方可揭曉答案。
遞增陣列中絕對值最小的數
求乙個遞增的整數陣列中,絕對值最小的數。陣列中可以有正負整數和0,要求複雜度 o logn 思路 有序陣列,用二分查詢。如果乙個數大於零,那麼要找的數在他左邊或者是他本身。如果乙個數小於零,那麼要找的數在他右邊或者是他本身。遞迴查詢。public class solution if array en...
面試題81 有序陣列中絕對值最小的元素
題目 給定乙個有序整數序列 非遞減序 可能包含負數,找出其中絕對值最小的元素,比如給定序列 5 3 1 2 8則返回1。思路 由於是有序陣列,而且是搜尋問題,所以首先考慮二分查詢法。對於每個子陣列,可以考慮一下幾種情況 1 如果給定的序列中所有的數都是正數,那麼陣列的第乙個元素就是結果。2 如果給定...
如何求陣列中絕對值最小的數?
有乙個公升序排列的陣列,陣列中可能有正數,負數或0,求陣列中元素的絕對值最小的數。例如,陣列 10,5,2,7,15,50 該陣列中絕對值最小的數是2 def fingmin1 array if array none or len array 0 print 輸入引數不合理 return 0 min...