[LeetCode] Search in Rotated Sorted Array II

来源:互联网 发布:mac卸载软件 编辑:程序博客网 时间:2024/06/06 06:37

题目

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

假设一个以升序排列的数组在预先知道的枢轴上旋转。

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Write a function to determine if a given target is in the array. The array may contain duplicates.

编写一个函数来确定给定的目标是否在数组中。数组可能包含重复项。

分析

其实这就是一个循环有序数组,循环有序数组就是将一个有序数组切成两段,并交换位置。

主要思路还是利用二分查找,但由于循环的原因,划分数组时会出现不同情况,因此要做进一步的判断。

  1. 当目标元素 = 中间元素时,直接返回中间元素索引。
  2. 当中间元素 < 起始元素时,从中间元素到结束元素是有序的。此时可以判断目标元素是否在有序部分中。
    若目标元素在有序部分中,在其中进行二分查找。否则在循环部分中进行查找。
  3. 当中间元素 > 起始元素时,从起始元素到中间元素时有序的。此时可以判断目标元素是否在有序部分中。
    若目标元素在有序部分中,在其中进行二分查找。否则在循环部分中进行查找。
  4. 当中间元素 = 起始元素时,无法判断在哪半边查找,只能移动一位,直至遇到其他情况。

注:由于本题是判断目标元素的位置,和在循环有序数组找最小值可以直接认定循环又有序部分的起始元素就是最小值不同,需要一步步二分查找,故循环条件是起始元素 ≤ 结束元素,而不是起始元素小于结束元素即可。

代码

#include <iostream>#include <vector>using namespace std;class Solution {public:    bool search(vector<int>& nums, int target) {        int start = 0, end = nums.size() - 1;        while (start <= end) {            int mid = (start + end) / 2;            if (target == nums[mid]) {                return true;            }            if (nums[mid] < nums[start]) {                if (target > nums[mid] && target <= nums[end]) {                    start = mid + 1;                } else {                    end = mid - 1;                }             } else if (nums[mid] > nums[start]) {                if (target >= nums[start] && target < nums[mid]) {                    end = mid - 1;                } else {                    start = mid + 1;                }            } else {                start++;            }        }        return false;    }};int main() {    int num[] = {4, 4, 4, 4, 4, 0, 1, 2, 3};    int target = 2;    int length = sizeof(num) / sizeof(int);    vector<int> nums(num, num + length);    Solution solution;    bool exist = solution.search(nums, target);    cout << "In the array, whether the target exists:" << exist << endl;}

参考博客

CSDN 博客:http://blog.csdn.net/linhuanmars/article/details/20588511

原创粉丝点击