leetcode :Search in Rotated Sorted Array I&&II

一、Search in Rotated Sorted Array:

在一个 rotated 之后的有序数组中,寻找某个数,很自然的想到二分查找。

在二分查找的过程中,既可以按照left --- right 是否有序来分情况讨论,也可以按照 left --- mid 是否有序来分情况讨论,问题在于需要注意边界问题以及考虑 rotated 之后的数组依旧有序的情况。

在对可能性进行初步划分之后,寻找 left = mid + 1的条件,余下的情况则是right= mid - 1

AC代码:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        while (left <= right) {
            int mid = (right + left) / 2;
            if (nums[mid] == target) return mid;
            if (nums[left] <= nums[mid]) { //依left -- mid 是否有序来划分情况
                if (target > nums[mid] || target < nums[left]) { //此时需要考虑 right --- left 是否有序,找到所有的下一步是left  = mid + 1 的情况
                    left = mid + 1;
                } else {  //剩下的则都是 right = mid - 1, 因为 target != nums[mid], 所以 target 不在 mid 左边就在 mid 右边
                    right = mid - 1;
                }
            } else { // 同理
                if (target > nums[mid] && target <= nums[right]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
};

 

二、Search in Rotated Sorted Array II

II 在 I 的基础上增加一个额外条件,就是数组可能出现重复元素 : 

由于出现重复元素时,需要对 nums[left] == nums[mid] 这种情况另外处理,因为nums[left] == nums[mid] 并不意味着left == mid, 所以上面在判断 left -> mid 是否有序时,需要对 nums[left] == nums[mid] 进行额外判断。

AC 代码:

class Solution {
public:
    bool search(vector<int>& nums, int target) {
        return _search(nums, target) != -1;
    }
    int _search(vector<int>& nums, int target) { //对上一题的search进行了修改
        int left = 0, right = nums.size() - 1;
        
        while (left <= right) {
            int mid = (right + left) / 2;
            if (nums[mid] == target) return mid;
            if (nums[left] < nums[mid]) {
                if (target > nums[mid] || target < nums[left]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            } else if (nums[left] > nums[mid] ) {
                if (target > nums[mid] && target <= nums[right]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            } else {  //对 nums[mid] == nums[left] 的情况进行特别处理, 此处为唯一修改的地方
                while (left <= mid && nums[left] == nums[mid]) {
                    ++left;
                }
            }
        }
        return -1;
    }
};

 

posted on 2016-03-27 21:40  远近闻名的学渣  阅读(123)  评论(0)    收藏  举报

导航