LeetCode: Search in Rotated Sorted Array 解题报告
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.

SOLUTION 1:
使用九章算法经典递归模板:
while (l < r - 1) 可以避免mid与left重合的现象。
其实和一般的二分法搜索没有太多区别。
问题是我们每次要找出正常排序的部分,你只需要比较mid, left,如果它们是正序,就代表左边是
正常排序,而右边存在断开的情况,也就是因为Rotated发生不正常序列。
例如:
4567012 如果我们取mid为7,则左边是正常序列,而右边7012不正常。
然后 我们再将target与正常排序的这边进行比较,如果target在左边,就丢弃右边,反之,丢弃
左边。一次我们可以扔掉一半。和二分搜索一样快。
public class Solution {
public int search(int[] A, int target) {
if (A == null || A.length == 0) {
return -1;
}
int l = 0;
int r = A.length - 1;
while (l < r - 1) {
int mid = l + (r - l) / 2;
if (A[mid] == target) {
return mid;
}
// left side is sorted.
// BUG 1: if don't use >= , and use L < r in while loop, than there is some problem.
if (A[mid] > A[l]) {
if (target > A[mid] || target < A[l]) {
// move to right;
l = mid + 1;
} else {
r = mid - 1;
}
} else {
if (target < A[mid] || target > A[r]) {
// move to left;
r = mid - 1;
} else {
l = mid + 1;
}
}
}
if (A[l] == target) {
return l;
} else if (A[r] == target) {
return r;
}
return -1;
}
}
SOLUTION 2:
注意,如果while 循环使用l <= r来卡,则mid有可能会靠到l这这来,所以当判断是否有序时,我们必须使用<=
总之,这份代码就不需要最后再判断l,r的值。
public int search(int[] A, int target) {
if (A == null || A.length == 0) {
return -1;
}
int l = 0;
int r = A.length - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (A[mid] == target) {
return mid;
}
// left side is sorted.
// BUG 1: if don't use >= , and use L < r in while loop, than there is some problem.
if (A[mid] >= A[l]) {
if (target > A[mid] || target < A[l]) {
// move to right;
l = mid + 1;
} else {
r = mid - 1;
}
} else {
if (target < A[mid] || target > A[r]) {
// move to left;
r = mid - 1;
} else {
l = mid + 1;
}
}
}
return -1;
}
FOLLOWUP:
LeetCode 新题: Find Minimum in Rotated Sorted Array 解题 ...
LeetCode 新题: Find Minimum in Rotated Sorted Array II 解 ...
代码: GitHub代码链接
LeetCode: Search in Rotated Sorted Array 解题报告的更多相关文章
- 【LeetCode】33. Search in Rotated Sorted Array 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- LeetCode: Search in Rotated Sorted Array II 解题报告
Search in Rotated Sorted Array II Follow up for "LeetCode: Search in Rotated Sorted Array 解题报告& ...
- 【LeetCode】153. Find Minimum in Rotated Sorted Array 解题报告(Python)
[LeetCode]153. Find Minimum in Rotated Sorted Array 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode. ...
- 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 ...
- [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]Search in Rotated Sorted Array II @ Python
原题地址:https://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/ 题意: Follow up for "Sea ...
- [LeetCode] Search in Rotated Sorted Array II 在旋转有序数组中搜索之二
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...
- [LeetCode] 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 migh ...
- LeetCode——Search in Rotated Sorted Array II
Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...
随机推荐
- java struts2入门学习--基于xml文件的声明式验证
一.知识点总结 后台验证有两种实现方式: 1 手工验证顺序:validateXxx(针对Action中某个业务方法验证)--> validate(针对Action中所有的业务方法验证) 2 声明 ...
- OAuth的机制原理讲解及开发流程(转)
1.OAuth的简述 OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是 ...
- TensorFlow Google大会总结
一.概述 介绍TPU,需要使用XLA编译,否则没有做内部优化,无法达到加速的效果: TPU相关的性能分析器: 二.新版本的输入库 之前TensorFlow的输入方式: feed_dict: 太过于低效 ...
- 【Oracle】Oracle中使用转义字符
1.Oracle 特殊字符 转义 关键词:oracle 转义 环境:oracle9i plsql 在plsql ...
- ActiveX IE保护模式下的低权限操作路径及Windows操作系统特殊路径
参考理解IE保护模式:https://blog.csdn.net/xt_xiaotian/article/details/5336809 文件帮助类: public class FileHelp { ...
- 《JAVA与模式》之原型模式(转载)
原型模式其实就是java的拷贝机制 原文出处:http://blog.csdn.net/zhengzhb/article/details/7393528 定义:用原型实例指定创建对象的种类,并通过 ...
- Linux中断的系统调用
早期UNIX系统的一个特性是:如果在进程执行一个低速系统调用而阻塞期间捕捉到一个信号,则该系统调用就被中断不再继续执行.该系统调用返回出错,其errno设置为EINTR.这样处理的理由是:因为一个信号 ...
- CTreeCtrl鼠标双击响应函数中怎么知道双击的是哪个子项?
原帖链接: http://bbs.csdn.net/topics/310185501 楼主: CTreeCtrl鼠标双击响应函数中怎么知道双击的是哪个子项? 6楼: CPoint pt;GetCurs ...
- Django form入门详解--2
调整form的输出格式: 默认情况下form的格式化输出是基本table的样式的.但是django中还是为form提供发别的输出样式 1.默认的table样式输出 <html> <h ...
- laravel用redis保存session遇到的坑,没报错,但redis-cli就是查不到
laravel用redis保存session遇到的坑, 配置redis存储session流程是这样的 在.evn文件中把session驱动和连接改为了redis的 如下: SESSION_DRIVER ...