Search in Rotated Sorted Array I&&II——二分法
Search in Rotated Sorted Array I
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.
做完了Find Minimum in Rotated Sorted Array之后,对这题又发现了一种非常简单的做法。
Find Minimum in Rotated Sorted Array的思路如下:
当nums[left]<nums[right],说明数组没有旋转,是按升序排列的。可直接返回nums[left];
当nums[left]<nums[mid],说明left至mid这段是按升序排列的,可令left=mid+1;
当nums[left]>nums[mid],说明mid至right这段是按升序排列的,可令right=mid;
那么这题的解法也就出来了,把数组分成两部分,那肯定是有一部分是有序的,另一部分是无序的,不管有序还是无序,都对其继续进行二分搜索,最终肯定都能得到有序的数组,不过这样做感觉就不是二分搜索了,因为每次并没有去掉一半。
也是通过二分搜索来解决,先通过一个二分搜索找到旋转的点,再分别对前后两个有序数组使用二分搜索,思路很简单,代码也没自己写了。
转:http://blog.csdn.net/zhangwei1120112119/article/details/16829309
class Solution {
public: int search_2(vector<int>& A, int L, int R, int target)
{
while(L<=R)
{
int mid=(L+R)>>;
if(A[mid]>target)
{
R=mid-;
}
else if(A[mid]<target)
{
L=mid+;
}
else return mid;
}
return -;
} int search(vector<int>& nums, int target) {
int n=nums.size();
vector<int> A(nums);
if(n == ) return -;
if(n == )
{
if(A[] == target) return ;
else return -;
}
if(n == )
{
if(A[] == target) return ;
else if(A[] == target) return ;
else return -;
}
int L=,R=n-;
while(L<R)//[0,n-2]找一个比A[n-1]大的数
{
int mid=(L+R>>)+;
if(A[mid]>A[n-]) L=mid;
else R=mid-;
}
int split=L;
if(A[L]<A[n-]) split=n-;
//[0,split],[split+1,n-1]
int ans;
ans=search_2(A,,split,target);
if(ans!=-) return ans;
if(split+<=n-)
{
return search_2(A,split+,n-,target);
}
return -;
}
};
Search in Rotated Sorted Array II
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 subSearch(vector<int>& nums,int left,int right,int target)
{
if(left>right)
return false;
if(nums[left]==target)
return true;
while(nums[left]==nums[right]&&left<right)
left++;
if(left==right)
{
if(nums[left]==target)
return true;
else
return false;
}
int mid=(left+right)/;
if(nums[left]<nums[right])
{
if(nums[left]>target||nums[right]<target)
return false;
else
{
if(target==nums[mid])
return true;
if(target>nums[mid])
left=mid+;
else
right=mid;
return subSearch(nums,left,right,target);
} }
else
return subSearch(nums,left,mid,target)|| subSearch(nums,mid+,right,target);
}
bool search(vector<int>& nums, int target) {
int left=;
int right=nums.size()-;
return subSearch(nums,left,right,target);
}
};
Search in Rotated Sorted Array I&&II——二分法的更多相关文章
- LeetCode:Search in Rotated Sorted Array I II
LeetCode:Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to y ...
- Search in Rotated Sorted Array I II
Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...
- Search in Rotated Sorted Array (I, II) 解答
Question Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 ...
- 33. Search in Rotated Sorted Array旋转数组二分法查询
一句话思路:反正只是寻找一个最小区间,断开也能二分.根据m第一次的落点,来分情况讨论. 一刷报错: 结构上有根本性错误:应该是while里面包括if,不然会把代码重复写两遍,不好. //situati ...
- LeetCode: Search in Rotated Sorted Array II 解题报告
Search in Rotated Sorted Array II Follow up for "LeetCode: Search in Rotated Sorted Array 解题报告& ...
- 【leetcode】Search in Rotated Sorted Array II
Search in Rotated Sorted Array II Follow up for "Search in Rotated Sorted Array":What if d ...
- 49. Search in Rotated Sorted Array && Search in Rotated Sorted Array II
Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...
- [LeetCode] Search in Rotated Sorted Array I (33) && II (81) 解题思路
33. Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you be ...
- 【一天一道LeetCode】#81. Search in Rotated Sorted Array II
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Follow ...
随机推荐
- Tomcat启动web项目报Bad version number in .class file (unable to load class ...)错误的解决方法
一.发现问题:启动 tomcat 控制台报该错误. 二.原因:tomcat 的 jdk 版本和编译.class的 jdk 版本不一致. 三.解决办法: 步骤一: 查看 MyEclipse ...
- LightOJ 1023 Discovering Permutations 水题
http://www.lightoj.com/volume_showproblem.php?problem=1023 题意:26字母全排列 思路:用next_permutation或者思维想一下都可以 ...
- vijos 1471 线性DP+贪心
描述 Orz教主的成员为教主建了一个游乐场,在教主的规划下,游乐场有一排n个弹性无敌的跳跃装置,它们都朝着一个方向,对着一个巨大的湖,当人踩上去装置可以带你去这个方向无限远的地方,享受飞行的乐趣.但是 ...
- Cppcheck代码分析下
1.流解析 解析函数中的可能的代码执行流, 函数实际执行中只会执行代码流中的一条流 分析: 分支语句 if-else ,switch-case 循环语句 while, do-while ...
- redis linux下的环境搭建
系统 CentOS7 Redis 官网下载 https://redis.io/download 1.下载解压 [root@TestServer-DFJR programs]# /usr/loca ...
- Enterprise Architect 13 : 设置默认代码环境
设置默认代码环境: Configure -> Options -> Source Code Engineering -> Default Language For Code Gene ...
- python读文件和写入文件复习
with open("name.txt",'r') as read_file: for name in read_file: list_name = (name.split(',' ...
- Java——Iterate through a HashMap
遍历Map import java.util.*; public class IterateHashMap { public static void main(String[] args) { Map ...
- bzoj3172 Ac自动机
根据fail树的性质 我们在建树的时候每建一个串就将他路径上的点全部加1表示这个串的后缀又出现了一次 然后从下到上把sum加起来就可以得到答案了 #include<cstdio> #inc ...
- Android检测View的可见性
Android中我们经常会用到判断View的可见行,当然有人会说View.VISIBLE就可以了,但是有时候这个真是满足不了,有时候我们为了优化,在View滚到得不可见的时候或者由于滚到只显示了部分内 ...