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 ...
随机推荐
- exBSGS板子
/*bzoj2480*/ #include <map> #include <cmath> #include <cstdio> #include <cstrin ...
- poco普通线程
#include "Poco/Thread.h" #include "Poco/RunnableAdapter.h" #include <iostream ...
- Linux系统上的popen()库函数
popen可以是系统命令,也可以是自己写的程序a.out. 假如a.out就是打印 “hello world“ 在代码中,想获取什么,都可以通过popen获取. 比如获取ls的信息, 比如获取自己写的 ...
- oracle数据库解锁
当我们修改数据库时用for update 或者使用rowId修改后,对表进行了锁定,由于某种原因没有对他进行关闭,我们需要关闭 select b.username,b.sid,b.serial#,lo ...
- 淘淘搜索结果中image属性中有多张图片的处理
solr引擎查询某一个 商品后的结果中,image字段中如果有多张图片路径(用逗号隔开)时,前台会不 显示图片,解决方法如下: package com.taotao.portal.pojo; publ ...
- Codeforces Round #539 (Div. 2) 题解
Codeforces Round #539 (Div. 2) 题目链接:https://codeforces.com/contest/1113 A. Sasha and His Trip 题意: n个 ...
- JQuery学习六
<JQuery cookie>插件 cookie是保存在浏览器上的内容,用户在这次浏览页面的时候向cookie中保存文本内容.下次再访问页面的时侯就可以取出来上次保存的内容.这样可以得到上 ...
- HDU1698 线段树(区间更新区间查询)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU 1728 逃离迷宫 (广搜)
题目链接 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可 ...
- grunt、Browsersync服务及weinre远程调试
一.grunt server服务 前端开发时,经常需要把静态文件映射成web服务,传统的做法是丢到apache,但太重太不友好了.开发angular的时候,官方的chrome插件对file:///的支 ...