Search in Sorted Array,Search in Rotated Sorted Array,Search in Rotated Sorted ArrayII
一:Search in Sorted Array
二分查找,可有重复元素,返回target所在的位置,只需返回其中一个位置,代码中的查找范围为[low,high),左闭右开,否则容易照成死循环。
代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int numsSize = nums.size();
int low = ,high = numsSize;
while(low < high){
int mid = low + (high-low)/;
if(nums[mid]==target){
return mid;
}else if(nums[mid]<target){
low = mid+1;
}else if(nums[mid]>target){
high = mid;
}
}
return -;
}
};
二:Search in Rotated Sorted Array
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.
数组中不存在重复元素
这时没法像通常的二分查找那样的直接定位target在中点元素的哪一端,需要进行讨论。如果target<A[mid],有两种可能,一种是mid在左边有序数组,另一种可能是mid在右侧的有序数组。mid在左边有序数组,那么target又有两种可能,可以在左边有序数组,也可在右边有序数组;如果mid在右侧有序数组,那么只有一种可能,只能在右侧数组。同理可以讨论target>A[mid]时的情况。而mid在左侧有序数组还是右侧有序数组可以通过A[mid]>A[low]?的关系确定。当然可以画图分析,红线部分表示mid可能的位置:

代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int numsSize = nums.size();
int low = ,high = numsSize;
while(low < high){
int mid = low + (high-low)/;
if(nums[mid]==target){
return mid;
}else if(nums[mid]<target){
if(nums[mid]>nums[low]){//mid位于左边区域
low = mid+;
}else{//mid位于右边区域
if(target>nums[low]){
high = mid;
}else if(target == nums[low]){
return low;
}else{
low = mid+;
}
}
}else if(nums[mid]>target){
if(nums[mid]>nums[low]){//mid位于左边区域,target有两个可能的区域位置
if(target>nums[low]){
high = mid;
}else if(target == nums[low]){
return low;
}else{
low = mid+;
}
}else{//mid位于右边区域
high = mid;
}
}
}
return -;
}
};
三:Search in Rotated Sorted ArrayII
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.
数组中如果有重复元素时,时间复杂度退化到o(n)。
如果有重复元素,当A[mid]>=A[low]时,我们无法确定mid在左边有序数组还是右边有序数组,可以画图理解,如下两幅图,红线部分表示mid的位置,两幅图中均有A[mid]>=A[low]

由于当target>A[mid]时,我们无法确定mid在哪个有序数组中,所以我们没法讨论了,此时,我们将low上升一个,high下降一个。
代码:
class Solution {
public:
bool search(vector<int>& nums, int target) {
int numsSize = nums.size();
int low = ,high = numsSize;
while(low < high){
int mid = low + (high-low)/;
if(nums[mid]==target){
return true;
}else if(nums[mid]<target){
if(nums[mid]>=nums[low]){//无法确定mid在左边区域还是在右边区域
if(target == nums[low] || target==nums[high-]){
return true;
}
low++;
high--;
}else{//mid位于右边区域
if(target>nums[low]){
high = mid;
}else if(target == nums[low]){
return true;
}else{
low = mid+;
}
}
}else if(nums[mid]>target){
if(nums[mid]>=nums[low]){//无法确定mid在左边区域还是在右边区域
if(target == nums[low] || target==nums[high-]){
return true;
}
low++;
high--;
}else{//mid位于右边区域
high = mid;
}
}
}
return false;
}
};
Search in Sorted Array,Search in Rotated Sorted Array,Search in Rotated Sorted ArrayII的更多相关文章
- Why is processing a sorted array faster than an unsorted array?
这是我在逛 Stack Overflow 时遇见的一个高分问题:Why is processing a sorted array faster than an unsorted array?,我觉得这 ...
- Why is processing a sorted array faster than an unsorted array(Stackoverflow)
What is Branch Prediction? Consider a railroad junction: Image by Mecanismo, via Wikimedia Commons. ...
- Lowest Common Ancestor of a Binary Search Tree、Lowest Common Ancestor of a Binary Search Tree
1.Lowest Common Ancestor of a Binary Search Tree Total Accepted: 42225 Total Submissions: 111243 Dif ...
- javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)
最后一例,搞得快.三天之内走了一次.. 下一步,面象对像的javascript编程. function Dictionary(){ var items = {}; this.has = functio ...
- String方法,js中Array方法,ES5新增Array方法,以及jQuery中Array方法
相关阅读:https://blog.csdn.net/u013185654/article/details/78498393 相关阅读:https://www.cnblogs.com/huangyin ...
- [ES2016] Check if an array contains an item using Array.prototype.includes
We often want to check if an array includes a specific item. It's been common to do this with the Ar ...
- JavaScript,通过分析Array.prototype.push重新认识Array
在阅读ECMAScript的文档的时候,有注意到它说,数组的push方法其实不仅限于在数组中使用,专门留作通用方法.难道是说,在一些类数组的地方也可以使用?而哪些是和数组非常相像的呢,大家或许一下子就 ...
- numpy array转置与两个array合并
我们知道,用 .T 或者 .transpose() 都可以将一个矩阵进行转置. 但是一维数组转置的时候有个坑,光transpose没有用,需要指定shape参数, 在array中,当维数>=2, ...
- [Javascript] Different ways to create an new array/object based on existing array/object
Array: 1. slice() const newAry = ary.slice() 2. concat const newAry = [].concat(ary) 3. spread oprea ...
- php xml转数组,数组转xml,array转xml,xml转array
//数组转XML function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key=>$val) ...
随机推荐
- ThinkPHP使用Memcached缓存数据
ThinkPHP默认使用文件缓存数据,支持Memcache等其他缓存方式,有两个PHP扩展:Memcache和Memcached,Memcahe官方有说明,主要说一下Memcached. 相对于PHP ...
- 关于继承扩展ASP.NET控件(以Textbox为例)
以下是一个相对简陋的扩展, 主要是针对金额显示的Textbox扩展. using System; using System.Collections.Generic; using System.Linq ...
- JS实现给页面表单设置触发默认按钮
var defaultBtnId; function setDefaultButton(id) { defaultBtnId = id; } document.onkeydown = function ...
- XPath语法 在C#中使用XPath示例
XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识. 示例Xml: <?xml version="1.0" en ...
- oc内存管理总结(一)
**内存管理 问题 1.什么是ios内存管理? 就是在对象不再被使用的时候,把它即时的从内存中清除掉 2.为什么要使用内存管理? 1.严格的内存管理,能够是我们的应用程在性能上有很大的提高 2.如果忽 ...
- C++ 多态性浅谈
多态:一个接口, 多种方法.程序在运行时才决定调用的函数是什么. C++多态通过 虚函数实现, 虚函数允许子类重新定义成员函数, 子类override父类. 多态与非多态的实质区别:函数地址是早绑定还 ...
- Linux环境下常用的SSH命令
目录操作: rm -rf mydir /*删除mydir目录*/ mkdir dirname /*创建名为dirname的目录*/ cd mydir /*进入mydir目录*/ cd – /*回上一级 ...
- Python即时网络爬虫:API说明
API说明——下载gsExtractor内容提取器 1,接口名称 下载内容提取器 2,接口说明 如果您想编写一个网络爬虫程序,您会发现大部分时间耗费在调测网页内容提取规则上,不讲正则表达式的语法如何怪 ...
- webapi文档
webapi文档描述-swagger 最近做的项目使用mvc+webapi,采取前后端分离的方式,后台提供API接口给前端开发人员.这个过程中遇到一个问题后台开发人员怎么提供接口说明文档给前端开发人员 ...
- 什么是JS事件冒泡
什么是JS事件冒泡? 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个 ...