做外贸找客户最好用的网站,做网站的公司北京有哪些,山东广饶县建设局网站,wordpress音频样式题目
已知一个长度为 n 的数组#xff0c;预先按照升序排列#xff0c;经由 1 到 n 次 旋转 后#xff0c;得到输入数组。例如#xff0c;原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到#xff1a;
若旋转 4 次#xff0c;则可以得到 [4,5,6,7,0,1,4]若旋转 7 次预先按照升序排列经由 1 到 n 次 旋转 后得到输入数组。例如原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到
若旋转 4 次则可以得到 [4,5,6,7,0,1,4]若旋转 7 次则可以得到 [0,1,4,4,5,6,7]
注意数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。
给你一个可能存在 重复 元素值的数组 nums 它原来是一个升序排列的数组并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。
你必须尽可能减少整个过程的操作步骤。
示例 1
输入nums [1,3,5]
输出1示例 2
输入nums [2,2,2,0,1]
输出0
题解
与153题不同的是数组中存在相等的元素因此需要一个条件来继续使用二分法
class Solution {public int findMin(int[] nums) {//如果刚开始是个有序数组 那么需要跟最后一个元素比较//所以闭区间为[0,n-2]int left 0;int right nums.length - 2;while (left right) {int mid left (right - left)/2;if (nums[mid] nums[right 1]) {right mid - 1;} else if (nums[mid] nums[right 1]) {left mid 1;}else { //考虑到存在重复的元素 强制让二分进行下去right--;}}return nums[left];}
}