一: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的更多相关文章

  1. Why is processing a sorted array faster than an unsorted array?

    这是我在逛 Stack Overflow 时遇见的一个高分问题:Why is processing a sorted array faster than an unsorted array?,我觉得这 ...

  2. 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. ...

  3. 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 ...

  4. javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)

    最后一例,搞得快.三天之内走了一次.. 下一步,面象对像的javascript编程. function Dictionary(){ var items = {}; this.has = functio ...

  5. String方法,js中Array方法,ES5新增Array方法,以及jQuery中Array方法

    相关阅读:https://blog.csdn.net/u013185654/article/details/78498393 相关阅读:https://www.cnblogs.com/huangyin ...

  6. [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 ...

  7. JavaScript,通过分析Array.prototype.push重新认识Array

    在阅读ECMAScript的文档的时候,有注意到它说,数组的push方法其实不仅限于在数组中使用,专门留作通用方法.难道是说,在一些类数组的地方也可以使用?而哪些是和数组非常相像的呢,大家或许一下子就 ...

  8. numpy array转置与两个array合并

    我们知道,用 .T 或者 .transpose() 都可以将一个矩阵进行转置. 但是一维数组转置的时候有个坑,光transpose没有用,需要指定shape参数, 在array中,当维数>=2, ...

  9. [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 ...

  10. php xml转数组,数组转xml,array转xml,xml转array

    //数组转XML function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key=>$val) ...

随机推荐

  1. 11个有用的移动网页开发App和HTML5框架

    在过去的两年里,触屏设备飞速增长.iOS和Android设备让开发者和设计师开始重新思考他们的网页应用,以提供更好的触屏体验. 移动Web应用相对于本地的App有很多优势,虽然也有很多设计和开发上的挑 ...

  2. Android项目能运行,上传svn后再下载却不能运行

    今天遇到一个比较奇怪的问题,android项目上传到svn之前,可以运行,但是上传到svn后再check, 就出错. 搜索了一下,发现真的解决了问题. svn 不知道是出于什么原因,不能上传.so文件 ...

  3. C++输入和输出

    本文转载:blog.csdn.net/zhanghaotian2011/article/details/8868577博客 输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出 ...

  4. ASP.NET MVC Json() 处理大数据异常解决方法 json MaxJsonLength

    网上很多解决方案,在webconfig中添加,但是实践证明无效 <system.web.extensions> <scripting> <webServices> ...

  5. 学php之翻译wordpress(2)

    wp-load.php <?php /** * Bootstrap file for setting the ABSPATH constant * and loading the wp-conf ...

  6. 创建文件夹并解决解决unicode和ASCII码转换的问题

    # -*- coding: UTF-8 -*-import sysimport timeimport os #解决unicode和ASCII码转换的问题reload(sys) #解决unicode和A ...

  7. 从数据库中导出.csv文件

    需求: 本次将数据库中的数据导出成.csv文件(office可以打开), //数据的生成,根据你所选中的数据进行生成 //params:$activity_id -> 活动的id //param ...

  8. gnome-ssh-askpass:No such file or directory && unable to read askpass response

    1.使用git的时候,gnome-ssh-askpass出现“error: cannot run /usr/libexec/openssh/gnome-ssh-askpass: No such fil ...

  9. EntityFramework+Autofac+MVC+EasyUI 搭建公司基本服务项目

    去年年底用了2个星期的时间搭建了 这套框架,从ORM,IOC,MVC,EasyUI都仔细的研究了下,还有日志,异常等等.mvc 我已经开发过很多项目了,我就觉得自己写套框架,看看自己的水平如何.欢迎大 ...

  10. 什么是Activity、生命周期

    1.什么是Activity 1.当程序第一次运行时用户就会看这个Activity,这个Activity可以通过启动其他的Activity进行相关的操作. 2.当启动其他的Activty时这个当前的这个 ...