1. 程式人生 > 實用技巧 >劍指 Offer 11. 旋轉陣列的最小數字-7月22日

劍指 Offer 11. 旋轉陣列的最小數字-7月22日

題目

劍指 Offer 11. 旋轉陣列的最小數字

我的思路

顯然用二分查詢,時間複雜度logn,最壞情況可能達到n。

要注意二分查詢的邊界條件判斷,以及如果無法判斷此次二分是取左或者去右時,可以嘗試把上邊界下標減1,再重新二分(安全地縮小邊界)。

我的實現

class Solution {
public:
    int minArray(vector<int>& numbers) {
        int low = 0;
        int high = numbers.size()-1;
        int s;
        while(low!=high){
            s 
= low + (high - low)/2; if(numbers[high]>numbers[low]) return numbers[low]; else if(numbers[high]<numbers[low]&&numbers[s]>=numbers[low]) low = s + 1; else if(numbers[high]<numbers[low]&&numbers[s]<=numbers[low]) high = s;
else if(numbers[high]==numbers[low]){high--;} } return numbers[low]; } }; //二分查詢 /* 先把兩個指標low和high 指向陣列首尾。若最小元素的指標(下標)是m,二分過程中的分界下標是s。 可能存在以下幾種情況: 1.n[high]>n[low] return n[low] 2.n[high]<n[low] n[s]>=n[low] low = s+1 3.n[high]<n[low] n[s]<=n[high] high = s 4.n[high]==n[low] high--;//神來之筆,遇到無法判斷二分到哪一邊時,可以嘗試直接把上邊界象徵性減小一點,重新判斷
*/

拓展學習

為什麼官方的二分法的題解很多都是寫的low + (high - low) // 2而不是(high + low) // 2?

(high + low) 在兩者較大時會發生整型越界!