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; } };
浙公网安备 33010602011771号