这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. POJ1743 Musical Theme(后缀数组 二分)

    Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 33462   Accepted: 11124 Description A m ...

  2. 洛谷P2000 拯救世界(生成函数)

    题面 题目链接 Sol 生成函数入门题 至多为\(k\)就是\(\frac{1-x^{k+1}}{1-x}\) \(k\)的倍数就是\(\frac{1}{1-x^k}\) 化简完了就只剩下一个\(\f ...

  3. 【20190219】CSS-知识点整理:float、em、浏览器的渲染过程

    一.float与absolute 昨天看到一篇博客总结CSS中的一些关键知识点,里面对float元素进行了比较深入的解析,才发现我之前对float的理解不到位.float实际上最初的目的是为了实现图片 ...

  4. Windchill_IBA属性

    IBA属性:也可以称为软属性,创建IBA属性后并不会改变已有对象的数据库表结构,IBA的属性名和属性值由专门的表存放. StringDefinition表:字符串类型的IBA属性定义 :StringV ...

  5. Tomcat_记一次tomcatwar包应用简单部署过程

    记一次tomcat war包应用简单部署过程 by:授客 QQ:1033553122 1.  实践环境 Linux apache-tomcat-7.0.73 2.  实践步骤 # 解压tomcat压缩 ...

  6. Android项目实战(四十二):启动页优化,去除短暂白屏或黑屏

    大家会发现一个空项目,从手机桌面打开app是秒启动.但是对于自己开发的项目,有时会发现打开app的时候,会有短暂的1秒--2秒的白屏或者黑屏,然后才进入到程序界面. 个人理解为我们自己实现的Appli ...

  7. (网页)html5 canvas清空画布方法(转)

    总结以下三种清空canvas画布的方式: 1. 最简单的方法:由于canvas每当高度或宽度被重设时,画布内容就会被清空,因此可以用以下方法清空: function clearCanvas() { v ...

  8. spring学习总结——装配Bean学习一(自动装配)

    一.Spring配置的可选方案 Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系.但是,作为开发人员,你需要告诉Spring要创建哪些bean并且如何将其装配在一起.当描 ...

  9. aspectj eclipse4.6下载地址

    http://www.eclipse.org/ajdt/downloads/#46zips

  10. mssql sqlserver null数据类型专题

    摘要: 下文将详细讲述sql server NULL(空值)的相关知识,如下所示: 实验环境: sql server 2008 R2 NULL(空值)简介: mssql sqlserver null数 ...