查找旋转数组的最小值-- 二分查找
2017-09-03 18:36
225 查看
假定一个排序数组以某个未知元素为支点做了旋转,如:原数组0 1 2 4 5 6 7旋转后得到 45 6 7 0 1 2。请找出旋转后数组的最小值。假定数组中没有重复数字
o 旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的大小都大于后面子数组中的元素
n 4 5 6 7
0 1 2
n 注意到实际上最小的元素就是两个子数组的分界线。
思路: 4 5 6 7 0 1 2
o 用两个指针low,high分别指向数组的第一个元素和最后一个元素。如果是正常的排序数组(元素间不重复),第一个元素肯定小于最后一个元素。
o 计算中间位置mid= (low+high)/2;
n 若:A[mid]>A[low],则A[low,low+1….mid-1,mid]是递增序列,最小元素位于子数组A[mid+1,mid+2,…high]中。因此,做赋值low=mid+1;
n 若:A[mid]<A[low],则A[low,low+1….mid-1,mid]不是递增序列,即:中间元素该子数组中,做赋值high=mid。
n 注:对偶地,若考察A[mid]与A[high]的关系,能够得到相似的结论。
o 旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的大小都大于后面子数组中的元素
n 4 5 6 7
0 1 2
n 注意到实际上最小的元素就是两个子数组的分界线。
思路: 4 5 6 7 0 1 2
o 用两个指针low,high分别指向数组的第一个元素和最后一个元素。如果是正常的排序数组(元素间不重复),第一个元素肯定小于最后一个元素。
o 计算中间位置mid= (low+high)/2;
n 若:A[mid]>A[low],则A[low,low+1….mid-1,mid]是递增序列,最小元素位于子数组A[mid+1,mid+2,…high]中。因此,做赋值low=mid+1;
n 若:A[mid]<A[low],则A[low,low+1….mid-1,mid]不是递增序列,即:中间元素该子数组中,做赋值high=mid。
n 注:对偶地,若考察A[mid]与A[high]的关系,能够得到相似的结论。
相关文章推荐
- 【剑指offer】旋转数组的最小数字&&二分查找
- 二分查找——旋转数组的最小数字
- OJ日常 | 二分查找——旋转数组的最小数字
- 剑指Offer面试题8旋转数组的最小数字(二分查找)附带快排和按年龄排序
- 【剑指offer】【旋转数组的最小数字 】二分查找的变体
- LeetCode-Find Minimum in Rotated Sorted Array II-旋转排序数组找最小-二分查找
- 旋转数组的最小数字(剑指offer 二分 O(log n))
- 查找旋转数组的最小值
- 旋转数组的二分查找
- 二分查找的一个题---找出排序数组中绝对值最小的数
- 查找和排序:旋转数组的最小值
- 【剑指offer】2.4.1查找和排序——面试题8:旋转数组的最小数字
- leetcode 153. Find Minimum in Rotated Sorted Array 旋转数组(不重复)+二分查找
- 在一个旋转有序数组中,查找最小的数
- 《剑指offer》刷题笔记(查找和排序):旋转数组的最小数字
- 旋转数组二分查找问题
- 二维数组中的查找+旋转数组的最小数字+跳台阶迭代+求幂次+调整数组使奇数位于偶数之前
- 旋转数组的二分查找
- 旋转有序数组的二分查找
- 旋转数组的最小值---二分思想