LeetCode 33. Search in Rotated Sorted Array(在旋转有序序列中搜索)
2017-07-14 23:43
453 查看
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e.,
0 1 2 4 5 6 7might 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.
题目标签:Array 题目中给了我们一个旋转有序序列,让我们找到target的index。 其实利用最基本的一个一个找过来都可以通过- -, 题目应该说的更明确一点。让我们利用binary search来搜索。 以往我们利用binary search 来找的话,都是在排序好了的array里面。但是这一题,array不一定是排序好的。大部分情况都是一个array里,分2边,各自都是排序好的,但是中间有一个断点。我们来看原题中的例子: 0 1 2 4 5 6 7 最原始的时候是有序排列的, 现在开始向左rotate 1 2 4 5 6 7 0 从这时候开始,一边是有序的,另外一边也是有序的,中间有断点。 2 4 5 6 7 0 1 4 5 6 7 0 1 2 5 6 7 0 1 2 4 6 7 0 1 2 4 5 7 0 1 2 4 5 6 0 1 2 4 5 6 7 这里就回到了最初的情况 来分析一下,一旦开始rotate, 就变成分开的两个有序序列,中间有个断点在移动。因为这个断点一直在移动,所以不好根据这个变量来判断。那么我们来找一个不变量来判断。 我们看每次中间红色的点,当这个中间点比最左边蓝色的点大的时候,说明 左边的这半(包括中间点)一定是有序序列。右边的话,不确定。 当这个中间的点没有比左边点大的时候,那么说明右边的有序序列已经移动过来了,并且占据了中间点,那么右边的一半(包括中间点)一定是有序序列。 在了解这个规律后,就可以利用binary search来搜索了,binary search就是要判断,target 在哪一边,然后继续走到那一边里继续搜索。这里我们要通过那一半肯定是有序序列来帮助查找。首先判断中间点是不是target,不是的话就判断target是不是在有序序列里,通过有序序列里的两边来判断。是的话就继续跑到有序的那一边去继续搜索。如果不是在有序序列里,那么就跑到另外一边里面去继续搜索。
Java Solution:
Runtime beats 70.31%
完成日期:07/14/2017
关键词:Array
关键点:利用Binary Search 结合 rotated sorted array 中必然有一半是有序序列 来搜索
public class Solution { public int search(int[] nums, int target) { if(nums == null || nums.length == 0) return -1; int left = 0; int right = nums.length - 1; while(left <= right) { int mid = left + (right - left) / 2; if(nums[mid] == target) // if the middle one is target, return mid index return mid; else if(nums[mid] >= nums[left]) // meaning left half is ascending order { if(target >= nums[left] && target < nums[mid]) // if target is in left half right = mid - 1; // move to left half to search else // target is in right half left = mid + 1; // move to right half to search } else // meaning right half is ascending order { if(target > nums[mid] && target <= nums[right]) // if target is in right half left = mid + 1; else // target is in left half right = mid - 1; } } return -1; } }
参考资料:
http://www.cnblogs.com/grandyang/p/4325648.html
LeetCode 算法题目列表 - LeetCode Algorithms Questions List
相关文章推荐
- [LeetCode] 33. Search in Rotated Sorted Array 在旋转有序数组中搜索
- LeetCode 81. Search in Rotated Sorted Array II(在旋转有序序列中搜索之二)
- [Leetcode] search in rotated sorted array ii 搜索旋转有序数组
- LeetCode 33 Search in Rotated Sorted Array(在旋转排序数组中搜索)(*)
- [LeetCode] Search in Rotated Sorted Array 在旋转有序数组中搜索
- [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索 II
- leetcode 33.Search in Rotated Sorted Array 旋转数组二分查找法搜索
- LeetCode 33. Search in Rotated Sorted Array(旋转有序数组,查找目标值Ⅰ)
- LeetCode Search in Rotated Sorted Array II -- 有重复的旋转序列搜索
- [LeetCode] Search in Rotated Sorted Array II 在旋转有序数组中搜索之二
- leetcode 6. 在有序数组旋转后搜索 Search in Rotated Sorted Array
- LeetCode 33. Search in Rotated Sorted Array(旋转数组搜索)
- leetcode 7. 在有序可重复数组旋转后搜索 Search in Rotated Sorted Array II
- [Leetcode] search in rotated sorted array 搜索旋转有序数组
- 【LeetCode】Search in Rotated Sorted Array——旋转有序数列找目标值
- LeetCode 33 Search in Rotated Sorted Array(循环有序数组中进行查找操作)
- 033-Search in Rotated Sorted Array-在移动过的有序序列中搜索
- LeetCode 81. Search in Rotated Sorted Array II(搜索旋转的数组)
- [CareerCup] 11.3 Search in Rotated Sorted Array 在旋转有序矩阵中搜索
- 【LeetCode-面试算法经典-Java实现】【033-Search in Rotated Sorted Array(在旋转数组中搜索)】