leetcode 33. Search in Rotated Sorted Array
Posted mychen06
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 33. Search in Rotated Sorted Array相关的知识,希望对你有一定的参考价值。
https://leetcode.com/problems/search-in-rotated-sorted-array/
解法一:本来有序的数组经过rotate后,分成了两部分。以最大值为分割点。通过二分搜索找最大值。然后在[0 , maxi] , 和[maxi + 1 , nums.size()-1]两部分分别进行二分搜索,时间复杂度为o(logn)
参考大神的解法,实在是比较巧妙的方法,将两部分统一成一个部分;找到rotate了多少步,也就是找最小值的index。
找到最小值的index后,在rotate前的数组中进行二分搜索,找到rotate后的index,与target进行比较
class Solution { public: int search(vector<int>& nums, int target) { if(nums.empty()) return -1 ; int l = 0 , r = nums.size() - 1 , mini , len = nums.size(); while(l < r) { int mid = l + (r - l) / 2; if(nums[mid] > nums[r]) l = mid + 1 ; else r = mid ; } mini = l ; l = 0 ; r = nums.size() - 1 ; while(l <= r) { int mid = l + (r - l) / 2 ; int realm = (mid + mini) % len ; if(nums[realm] < target) l = mid + 1 ; else if(nums[realm] > target) r = mid - 1 ; else return realm ; } return -1 ; } };
重点:if中的语句应该是nums[mid] > nums[r] 而不是 nums[mid] > nums[l],这是因为如果rotate步数为0, 当nums[mid] > nums[l]最小值可能出现在左边
while(l < r) { int mid = l + (r - l) / 2; if(nums[mid] > nums[r]) l = mid + 1 ; else r = mid ; } mini = l ;
以上是关于leetcode 33. Search in Rotated Sorted Array的主要内容,如果未能解决你的问题,请参考以下文章
#Leetcode# 33. Search in Rotated Sorted Array
leetcode33. Search in rotated sorted array
一天一道LeetCode#33. Search in Rotated Sorted Array
leetcode 33. Search in Rotated Sorted Array