Search in Rotated Sorted Array && Search in Rotated Sorted ArrayII

Search in Rotated Sorted Array


我的思路:

1、在一個沒有重複數字,已經排序好的,旋轉過的數組中找到一個數,返回數組中的下標,如果沒有返回-1。

2、找到旋轉的軸,然後進行兩段二分查找。

3、關鍵是找到mid這個點。我使用的是兩個指針從後面往前遍歷查找。

class Solution {
public:
    int search(int A[], int n, int target) {
        if (n < 0)
            return -1;
        int begin = 0, end = n -1;
        while (A[begin] > A[end]) {
            begin++;
            end--;
        }
        int mid = begin == end ? (A[begin - 1] < A[begin] ? begin : begin - 1) : (A[end] > A[end + 1] ? end : begin - 1);
    
        int ans = binary_find(A, 0, mid, target);
        if (ans != -1)
            return ans;
        else
            return binary_find(A, mid + 1, n - 1, target);
    }
private:
    int binary_find(int *A, int low, int high, int target) {
        if (high < low)
            return -1;
        int mid = (low + high) / 2;
        while (low <= high) {
            if (A[mid] == target)
                return mid;
            else if (target > A[mid])
                low = mid + 1;
            else
                high = mid - 1;
            mid = (high + low) / 2;
        }
        return -1;
    }
};

別人思路:

1、別人都差不多,新的思路,見下一題。


Search in Rotated Sorted Array II

我的思路:

1、如果數組中有重複的數,會怎麼樣?

2、修改了下指針的移動方式,每次從兩邊開始比較兩對數,和兩個指針的大小。找到分割點。依舊使用二分查找來判斷是否存在這個數。

代碼如下:

    bool search(int A[], int n, int target) {
        if (n < 0)
            return false;
        else if (n == 1) {
            if (A[0] == target)
                return true;
            else 
                return false;
        }
        int begin = 0, end = n -1;
        while (A[begin] <= A[begin + 1] && A[end] >= A[end - 1] && begin <= end) {
            begin++;
            end--;
        }
        int mid = A[begin] > A[begin + 1] ? begin : end - 1;
        if (binary_find(A, 0, mid, target))
            return true;
        else
            return binary_find(A, mid + 1, n - 1, target);
    }

別人思路:

1、既然是旋轉數組,就可以在兩段中進行二分查找,分析好每段要怎麼劃分。每次直接找首尾兩端的中間點,從這個點開始兩端二分查找,每次都可以消除一半的數據。

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