问题描述
给定一个旋转过的升序数组,要求找出数组中的最小元素。题目链接:**点我**
样例输入输出
输入:[3,4,5,1,2]
输出:1
输入:[4,5,6,7,0,1,2]
输出:0
问题解法
此题最直观暴力的一种做法就是顺序遍历找出最小的元素。但是这很明显就无法利用 “升序” 的这一特点。所以遍历数组肯定不是题目的本意。观察旋转的升序数组,可以发现,如果数组第一个数字比最后一个数字大,那就说明数组是旋转过的,可以不断使用二分查找的方式进行排查过滤。如果数组第一个元素比最后一个数字大,那说明数组已经是有序的升序数组了,此时直接返回第一个元素即可。代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public int findMin(int[] nums) { if (nums.length == 1) { return nums[0]; } int start = 0; int end = nums.length - 1; if (nums[start] < nums[end]) { return nums[start]; }
while (start + 1 != end) { int middle = (start + end) / 2; if (nums[start] > nums[middle]) { end = middle; } else { start = middle; } }
return Math.min(nums[start], nums[end]); } }
|