【LeetCode】Search in Rotated Sorted Array旋转数组问题总结
来源:互联网 发布:移动网络电话号码 编辑:程序博客网 时间:2024/05/16 00:26
问题1. 数组中没有重复的数字
/************************************************************************
*
* Suppose a sorted array 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).
*
* You are given a target value to search. If found in the array return its index, otherwise return -1.
*
* You may assume no duplicate exists in the array.
*
************************************************************************/
此题常规的解法为O(N),即遍历一遍数组,找到与target相同的索引,但是这种做法明显没有利用给的条件去做题。
二分的方法主要分两步:
- 找到旋转数组中最小值的索引,这一点很巧妙,可以用二分的方法去寻找这个最小值的索引,代码如下:
while (low<high) { int mid=(low+high)>>1; if (nums[mid]>nums[high]) low=mid+1; else high=mid; }
2.找到最小值点的索引后,我们就知道了他的旋转点再哪里,即 rot=low
旋转了rot个长度。
例如: 1 3 5 7 9
旋转成 5 7 9 1 3
,则旋转了3个长度。
那么在我们再一次用普通的二分查找mid
时,实际上我们是查找旋转数组中的realmid=(mid+rot)%length
因此二分搞定。
综上所述,完整AC代码如下:
class Solution {public: int search(vector<int>& nums, int target) { int n=nums.size(); int low=0,high=n-1; //find the smallest index while (low<high) { int mid=(low+high)>>1; if (nums[mid]>nums[high]) low=mid+1; else high=mid; } int rot=low;low=0,high=n-1; //usualy binary search while (low<=high) { int mid=(low+high)>>1; int realmid=(mid+rot)%n; if (nums[realmid]==target) return realmid; else if (nums[realmid]>target) high=mid-1; else low=mid+1; } return -1; }};
问题2. 数组中有重复数字
/********************************************************************************** * * Follow up for "Search in Rotated Sorted Array":* What if duplicates are allowed?* * Would this affect the run-time complexity? How and why?* * Write a function to determine if a given target is in the array.* **********************************************************************************/
class Solution {public: bool search(vector<int>& nums, int target) { int left = 0, right = nums.size()-1, mid; while(left<=right) { mid = (left + right) >> 1; if(nums[mid] == target) return true; // the only difference from the first one, trickly case, just updat left and right if( (nums[left] == nums[mid]) && (nums[right] == nums[mid]) ) {++left; --right;} else if(nums[left] <= nums[mid]) { if( (nums[left]<=target) && (nums[mid] > target) ) right = mid-1; else left = mid + 1; } else { if((nums[mid] < target) && (nums[right] >= target) ) left = mid+1; else right = mid-1; } } return false; }};
0 0
- 【LeetCode】Search in Rotated Sorted Array旋转数组问题总结
- LeetCode @ Search in Rotated Sorted Array 旋转数组查找
- [LintCode] 搜索旋转排序数组 Search in Rotated Sorted Array
- Search in Rotated Sorted Array-旋转数组的查找
- Search in Rotated Sorted Array 旋转数组里查找数 @LeetCode
- Search in Rotated Sorted Array II 旋转数组(有重复元素)里找数@LeetCode
- LeetCode Search in Rotated Sorted Array 在旋转了的数组中查找
- Leetcode--Search in Rotated Sorted Array(旋转数组的查找)
- LeetCode | Search in Rotated Sorted Array(在旋转数组中查找)
- leetcode之Search in Rotated Sorted Array,剑指offer之旋转数组的最小数字
- 【LeetCode刷题】旋转数组的查找 Search in Rotated Sorted Array
- (每日算法)LeetCode --- Search in Rotated Sorted Array(旋转数组的二分检索)
- leetcode 6. 在有序数组旋转后搜索 Search in Rotated Sorted Array
- leetcode 7. 在有序可重复数组旋转后搜索 Search in Rotated Sorted Array II
- leetCode 33.Search in Rotated Sorted Array(排序旋转数组的查找) 解题思路和方法
- LeetCode 33 Search in Rotated Sorted Array(在旋转排序数组中搜索)(*)
- Leetcode #33. Search in Rotated Sorted Array 旋转数组查询 解题报告
- LeetCode 33. Search in Rotated Sorted Array(旋转数组搜索)
- python中的反射
- Android中获取应用程序(包)的信息-----PackageManager的使用(一)
- SAP 常用业务表格
- 微信公众号开发之4-消息类型的分类及处理消息的工具类封装
- 内存技术和优化
- 【LeetCode】Search in Rotated Sorted Array旋转数组问题总结
- ARM支持的三大工具链
- 离散二维小波变换 MATLAB
- jsp实体链接SQL2008
- 获取GetPlayerPawn,APlayerController,GetWorld,HUD
- 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
- TelephonyManager(电话管理器)
- epoll/et例子
- c++ 创建Utf8 文件