找出有序陣列中絕對值最小的數

2021-09-06 14:04:35 字數 1264 閱讀 3830

假設陣列是從小到大排序,數值可能為負數、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...