[算法]找出旋转数组的最小数字
2017-06-23 10:44
204 查看
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
思路:
旋转数组的特点是部分有序,前段和后段都是有序的,因此可以将它看作2个子数组,前段的数组元素值每个都比后段的数组元素大(例子中的3,4,5和1,2)。
利用这个特性,只要找到2个“子数组”的临界点,那么后段数组的第一位就是最小元素。
思路:
旋转数组的特点是部分有序,前段和后段都是有序的,因此可以将它看作2个子数组,前段的数组元素值每个都比后段的数组元素大(例子中的3,4,5和1,2)。
利用这个特性,只要找到2个“子数组”的临界点,那么后段数组的第一位就是最小元素。
public int minNumberInRotateArray(int [] array) { int low, mid, high; low = 0; high = array.length - 1; mid = (low + high) / 2; int round = 1; while (high > low && low >= 0) {//设置好查找区域边界 System.out.println("round:" + round++); System.out.println("low:" + low + ", mid:" + mid + ", high:" + high); if (high - low == 1 && array[high] < array[low]) { //如果已经找到相邻的2个数,且高位小于地位,则就是要找的2个子数组边界 System.out.println("return:" + array[high]); return array[high]; } mid = (low + high) / 2; if (array[low] > array[mid]) { high = mid; } else if (array[mid] > array[high]) { low = mid; } } return -1; }
相关文章推荐
- 《剑指Offer》算法题——“旋转数组”的最小数字
- 【算法】(遇到的问题)给定一个数组,找出不在数组中的最小的那个数字
- 每天一道算法题——旋转数组的最小数字
- [剑指offer]算法6 旋转数组的最小数字
- 算法练习六:旋转数组的最小数字
- 旋转数组的最小数字(改进版算法)
- 算法-旋转数组的最小数字
- 【LeetCode-面试算法经典-Java实现】【154-Find Minimum in Rotated Sorted Array II(找旋转数组中的最小数字II)】
- 找出旋转数组中的最小数字
- 算法复习:旋转数组的最小数字
- 重拾算法之剑指Offier——旋转数组的最小数字
- 剑指offer-算法题练习:part6 旋转数组的最小数字
- 算法题目---旋转数组的最小数字
- 九度OJ 1386 旋转数组的最小数字 【算法】
- 求旋转数组的最小数字算法的解析以及完整c语言代码实现
- 面试算法(七)旋转数组的最小数字
- 【LeetCode-面试算法经典-Java实现】【153-Find Minimum in Rotated Sorted Array(找旋转数组中的最小数字)】
- 九度OJ 1386 旋转数组的最小数字 【算法】
- 每天一道算法题10 找出数组中两个只出现一次的数字
- 旋转数组的最小数字