这4个题都是针对旋转的排序数组。其中153、154是在旋转的排序数组中找最小值,33、81是在旋转的排序数组中找一个固定的值。且153和33都是没有重复数值的数组,154、81都是针对各自问题的版本1增加了有重复数值的限制条件。

153、154都需要考虑是否旋转成和原数组一样的情况,特别的,154题还需要考虑10111和11101这种特殊情况无法使用二分查找。

33、81则不用考虑这些情况。

找最小值的题主要是利用最小值小于他前一个位置的数,同时也小于后一个位置的数

start是前面升序的最后一个,end是后面升序的第一个, 只剩两个时,end就代表了那个最小值

153. Find Minimum in Rotated Sorted Array

class Solution {
public:
int findMin(vector<int>& nums) {
int start = ;
int end = nums.size() - ;
int mid;
if(nums[start] < nums[end])
return nums[start];
while(start + < end){
mid = start + (end - start)/;
if(nums[mid] < nums[start])
end = mid;
else
start = mid;
}
return nums[end];
}
};

154. Find Minimum in Rotated Sorted Array II

class Solution {
public:
int findMin(vector<int>& nums) {
int start = ;
int end = nums.size() - ;
int mid = start + (end - start)/;
if(nums[start] < nums[end])
return nums[start];
if(nums[start] == nums[end] && nums[start] == nums[mid]){
int min_num = INT_MAX;
for(int i = ;i < nums.size();i++){
if(nums[i] < min_num)
min_num = nums[i];
}
return min_num;
}
while(start + < end){
mid = start + (end - start)/;
if(nums[mid] < nums[start])
end = mid;
else
start = mid;
}
return nums[end];
}
};

33. Search in Rotated Sorted Array

这个题和剑指上旋转数组求最小值有点不一样,还是用二分查找的方法做,但条件判断较为繁琐。首先明确一点,无论怎么分,左右两侧总有一个是有序的,并且一般情况左侧是大的数,右侧是小的数。mid小于target的时候,相当于要找一个更大的数,所以想法是先排除一般情况下小的数,如果start < mid,证明这是个升序,那只可能在右侧;如果start > mid,证明右侧是升序,只要和最大的比较,也就是end,如果比end小,说明数字在右侧,如果比end大,说明数字在左侧,因为比最大的都大了。

总体上就是当target大于mid的时候,就去比较可能出现大数的左侧区间,如果是升序,那就能排除;如果左侧区间不是升序,则右侧是升序,需要拿这个升序的最大值和mid进行比较来确定下一个区间

class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.empty())
return -;
int start = ;
int end = nums.size() - ;
int mid;
while(start + < end){
mid = start + (end - start)/;
if(nums[mid] == target)
return mid;
else if(nums[mid] < nums[end]){
if(nums[mid] < target && nums[end] >= target)
start = mid;
else
end = mid;
}
else{
if(nums[mid] > target && nums[start] <= target)
end = mid;
else
start = mid;
}
}
if(nums[start] == target)
return start;
if(nums[end] == target)
return end;
return -;
}
};

自己的写法:

其实是可以使用mid - 1,mid+1的,因为之前做了nums[mid] == target的判断,这说明mid不可能等于target,所以可以去掉。

最需要注意的是,在判断单调区间时,start、end与target的比较一定是<=或者>=,必须考虑边界相等的情况

总体的思路就是:判断单调区间,然后判断target属于不属于这个区间,属于就在这个区间找,不属于就去另一个区间找。判断属于不属于,就是拿target与这个区间的边界进行判断。

class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.empty())
return -;
int start = ,end = nums.size() - ;
while(start + < end){
int mid = start + (end - start)/;
if(nums[mid] == target)
return mid;
else if(nums[start] < nums[mid]){
if(target < nums[mid] && nums[start] <= target)
end = mid - ;
else
start = mid + ;
}
else{
if(target > nums[mid] && nums[end] >= target)
start = mid + ;
else
end = mid - ;
}
}
if(nums[start] == target)
return start;
if(nums[end] == target)
return end;
return -;
}
};

81. Search in Rotated Sorted Array II

这个题与Search in Rotated Sorted Array不同在于,这个题里面可能包含重复的数字。

代码上的区别主要是在进行单调区间判断的时候,即如果start或者end与mid的值相等的情况要单独列出来,列出来的方式是start++,mid--

Search in Rotated Sorted Array直接else其实是包括了=这种情况,但是因为本身数组不存在相等的,所以忽略了这个问题。

class Solution {
public:
bool search(vector<int>& nums, int target) {
if(nums.empty())
return false;
int start = ;
int end = nums.size() - ;
int mid;
while(start + < end){
mid = start + (end - start)/;
if(nums[mid] == target)
return true;
else if(nums[mid] < nums[end]){
if(nums[mid] < target && nums[end] >= target)
start = mid;
else
end = mid;
}
else if(nums[mid] > nums[end]){
if(nums[mid] > target && nums[start] <= target)
end = mid;
else
start = mid;
}
else
end--;
}
if(nums[start] == target)
return true;
if(nums[end] == target)
return true;
return false;
}
};

http://www.cnblogs.com/grandyang/p/4325840.html

704. Binary Search

class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.empty())
return -;
int start = ;
int end = nums.size() - ;
int mid;
while(start + < end){
mid = start + (end - start)/;
if(nums[mid] == target)
return mid;
else if(nums[mid] < target)
start = mid;
else
end = mid;
}
if(nums[start] == target)
return start;
if(nums[end] == target)
return end;
return -;
}
};

leetcode 153. Find Minimum in Rotated Sorted Array 、154. Find Minimum in Rotated Sorted Array II 、33. Search in Rotated Sorted Array 、81. Search in Rotated Sorted Array II 、704. Binary Search的更多相关文章

  1. leetcode 704. Binary Search 、35. Search Insert Position 、278. First Bad Version

    704. Binary Search 1.使用start+1 < end,这样保证最后剩两个数 2.mid = start + (end - start)/2,这样避免接近max-int导致的溢 ...

  2. 【Leetcode_easy】704. Binary Search

    problem 704. Binary Search solution: class Solution { public: int search(vector<int>& nums ...

  3. LeetCode 704. Binary Search (二分查找)

    题目标签:Binary Search 很标准的一个二分查找,具体看code. Java Solution: Runtime:  0 ms, faster than 100 % Memory Usage ...

  4. 704. Binary Search

    Given a sorted (in ascending order) integer array nums of n elements and a target value, write a fun ...

  5. [LeetCode] 704. Binary Search

    Description Given a sorted (in ascending order) integer array nums of n elements and a target value, ...

  6. 【LeetCode】704. Binary Search 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 线性查找 二分查找 日期 题目地址:https:// ...

  7. [LeetCode&Python] Problem 704. Binary Search

    Given a sorted (in ascending order) integer array nums of n elements and a target value, write a fun ...

  8. LeetCode编程训练 - 折半查找(Binary Search)

    Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...

  9. 算法与数据结构基础 - 折半查找(Binary Search)

    Binary Search基础 应用于已排序的数据查找其中特定值,是折半查找最常的应用场景.相比线性查找(Linear Search),其时间复杂度减少到O(lgn).算法基本框架如下: //704. ...

随机推荐

  1. 花十分钟,让你变成AI产品经理

    花十分钟,让你变成AI产品经理 https://www.jianshu.com/p/eba6a1ca98a4 先说一下你阅读本文可以得到什么.你能得到AI的理论知识框架:你能学习到如何成为一个AI产品 ...

  2. 矢量图面层和线层相交得到相交后的线层文件(gis相交)

    目的:将arcgis里的面层和线层相交(重叠)部分的线单独生成一个shp文件,用于道路路网密度计算等. 注意:进行相交运算后生成的是线要素文件,相当于把面线相交部分的线单独拿了出来. 操作例子:将图示 ...

  3. doc命令大全(详细版)

    doc命令大全(详细版) 1 echo 和 @回显命令@                        #关闭单行回显echo off                 #从下一行开始关闭回显@echo ...

  4. AndroBench手机性能测试

    AndroBench是一个基准测试应用程序,可以衡量你的Android设备的存储性能. AndroBench提供两种方式,第一种可以快速与其他设备的存储进行比较. 第二种 SQLite可以查询数据库表 ...

  5. vue使用axios请求后端数据

    1. 安装axios $ npm install axios 2.在main.js里面导入axios import axios from 'axios' Vue.prototype.$http = a ...

  6. RAS非对称加密与数字证书数字签名

    它用图片通俗易懂地解释了,"数字签名"(digital signature)和"数字证书"(digital certificate)到底是什么. 我对这些问题的 ...

  7. web前端(13)—— 了解JavaScript,JavaScript的引入方式

    从本篇博文开始,将进入web前端方便最关键最重要的部分——javascript,学到后面你就知道它真的太重要了 什么是JavaScript JavaScript一种直译式的脚本语言,是一种动态类型.弱 ...

  8. SQL Server最大内存设为0后的处置办法

    故障说明: 远程调整实例内存时疏忽,将实例最大内存调整为了0,因此最大内存变成了128MB的最小值. 解决方式: 1.正常关闭SQL Server服务,如果是集群,需要先关停止集群角色防止故障转移,然 ...

  9. c/c++ 广义表

    广义表 列表里面有列表,比如(1,(2,(3,4)),5) 用链表可以实现 结果如图 guangyibiao.h #ifndef __GUANGYIBIAO__ #define __GUANGYIBI ...

  10. 深入学习SpringMVC以及学习总结

    一.优点: 1.SpringMVC简化web程序开发; 2.SpringMVC效率很好(单例模式): 3.SpringMVC提供了大量扩展点,方便程序员自定义功能: ①.DispatcherServl ...