FollowUp-进阶-81-Search in Rotated Sorted Array II

250 阅读1分钟

FollowUp-进阶-81-Search in Rotated Sorted Array II

  1. Follow up: This problem is similar to Search in Rotated Sorted Array, but nums may contain duplicates. Would this affect the runtime complexity? How and why?
  2. 当数组中存在大量的重复数字时,二分查找法会退化为线性查找,即时间复杂度会由 O(logN) 变为 O(N)
  3. 例如:{3, 3, 3, 3, 0, 3},可以发现,当第一个数字和最后一个数字,还有中间那个数字全部相等的时候,二分查找法j就迷茫了,因为它不知道该去左半边还是右半边继续搜索。即在如下代码的 (4) 中,将右指针左移一位,跳过一个相同数字,然后继续二分查找,在最坏的情况下,比如 {3, 3, 3, 3} 数组所有元素都相同,时间复杂度会升到O(N)
  4. 同时,第四种情况也是处理数组中有重复数字的标配,即如果没有重复数字,去掉 (4) 即可。
  5. 相似题目有:
    • Search in Rotated Sorted Array
    • Find Minimum in Rotated Sorted Array
    • Find Minimum in Rotated Sorted Array II
    class Solution {
    public:
        bool search(vector<int>& arr, int tar) {
            int e = 0, r = arr.size() - 1;
            while (e <= r)
            {
                int m = e + ((r - e) >> 1);
                if (arr[m] == tar) return true; // (1) 
                else if (arr[r] < arr[m]) // (2) 在左侧搜索
                {
                    if (arr[e] <= tar && tar < arr[m]) r = m - 1;
                    else e = m + 1;
                }
                else if (arr[r] > arr[m]) // (3) 在右侧搜索
                {
                    if (arr[m] < tar && tar <= arr[r]) e = m + 1;
                    else r = m - 1;
                }
                else if (arr[r] == arr[m]) // (4) 相等,此时不知道怎么办了,只能跳过最右边的一个(或者跳过最左边的一个)
                    r--;
            }
            return false;
        }
    };