33. Search in Rotated Sorted Array && 81. Search in Rotated Sorted Array II
2016-01-11 11:16
603 查看
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.
思路
二分查找。不需要找出拐点,mid将数组分成left~mid,mid~right两部分,拐点只有一个,如下图所示,由于不存在重复数字,这两部分一定有一部分是有序的,在有序的部分里寻找target,如果不在有序的部分里,就肯定在另一部分。
82 Search in Rotated Sorted Array II题目中数组有可能出现重复数字就要复杂一点,mid将数组分成left~mid,mid~right两部分后,有可能不能确定两部分的有序性。如下图,如果left、mid、right三个点是图中三个红点,两部分的有序性就完全无法确定。这是只能right–,left++来找下一个位置。
这个问题里对于两部分的有序性的判断要更加严格。
1、left~mid有序的充要条件:A[left] < A[mid] || A[right] < A[mid].两部分肯定有一部分是有序的,前一个条件证明left~mid有序,后一个条件是mid~right无序,都能确定left~mid有序
2、反之,mid~right有序的充要条件:A[mid] < A[right] || A[left] >A[mid].
3.如果以上两个条件都不成立。那么久出现了图中的情况。A[left] = A[right] = A[mid].只能right–,left++之后判断了
(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.
思路
二分查找。不需要找出拐点,mid将数组分成left~mid,mid~right两部分,拐点只有一个,如下图所示,由于不存在重复数字,这两部分一定有一部分是有序的,在有序的部分里寻找target,如果不在有序的部分里,就肯定在另一部分。
public class Solution { public int search(int[] A, int target) { if (A == null || A.length == 0) return -1; int left = 0; int right = A.length - 1; while (left <= right) { int mid = left + (right - left) / 2; if (A[mid] == target) { return mid; } if (A[left] <= A[mid]) { //left~mid有序 if (A[left] <= target && target < A[mid]) { right = mid - 1; } else { left = mid + 1; } } else { //mid~right有序 if (A[mid] < target && target <= A[right]) { left = mid + 1; } else { right = mid - 1; } } } return -1; } }
82 Search in Rotated Sorted Array II题目中数组有可能出现重复数字就要复杂一点,mid将数组分成left~mid,mid~right两部分后,有可能不能确定两部分的有序性。如下图,如果left、mid、right三个点是图中三个红点,两部分的有序性就完全无法确定。这是只能right–,left++来找下一个位置。
这个问题里对于两部分的有序性的判断要更加严格。
1、left~mid有序的充要条件:A[left] < A[mid] || A[right] < A[mid].两部分肯定有一部分是有序的,前一个条件证明left~mid有序,后一个条件是mid~right无序,都能确定left~mid有序
2、反之,mid~right有序的充要条件:A[mid] < A[right] || A[left] >A[mid].
3.如果以上两个条件都不成立。那么久出现了图中的情况。A[left] = A[right] = A[mid].只能right–,left++之后判断了
public boolean search(int[] A, int target) { if (A == null || A.length == 0) return false; int left = 0; int right = A.length - 1; while (left <= right) { int mid = left + (right - left) / 2; if (A[mid] == target) { return true; } if (A[left] < A[mid] || A[right] < A[mid]) { //left~mid有序或者mid~right无序 if (A[left] <= target && target < A[mid]) { right = mid - 1; } else { left = mid + 1; } } else if(A[right] > A[mid] || A[left] > A[mid]){ //mid~right有序或者left~mid无序 if (A[mid] < target && target <= A[right]) { left = mid + 1; } else { right = mid - 1; } } else{ //A[mid] == A[left] = A[right] right--; left++; } } return false; }
相关文章推荐
- 相似度/距离公式汇总
- Sublime3使用总结
- Android 过度绘制性能优化<6>
- 基于Unity的Profiler性能分析
- mysql:commandnotfound
- 浅谈X3架构
- input元素相对父级元素错位了?IE7
- <8>降噪
- android消息处理机制学习(三)-Handler,Message,MessageQueue,Looper源码分析
- Python 汉字转拼音库 pypinyin
- Java中的return关键字
- 如何改变xcode 源文件保存的目录位置
- Html基础
- 关于spring mvc拦截器拦截js文件等导致无法正常使用问题的解决
- jquery使用淘宝接口跨域查询手机号码归属地实例
- mysql 更新有外键约束的字段
- MFC学习-第4课 消息机制和MFC作图
- android开发中的权限与权限获取
- 自定义数据类型 结构体 枚举 typedef
- VS2013 ADO.NET 连接 SQLEXPRESS