寻找旋转排序数组中的最小值
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:
若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]
若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]
给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。
题目来源:力扣(LeetCode)算法题。
以下为两种解法:
1.暴力解决
在没有巧思的情况下,应该想到的普适解:定义变量记录数组中最小元素(初始假定数组0索引处的元素即为最小值),遍历数组,判断元素大小。代码如下:
public class Min {
public static void main(String[] args) {
int[] nums = {4,5,6,7,0,1,2};
System.out.println(getMin(nums));//输出:0
}
//寻找最小元素
public static int getMin(int[] nums) {
//方法1.普适解
/*
定义辅助变量,记录最小元素值;遍历数组寻找最小值
*/
int min = nums[0];
for(int i = 0;i<nums.length;i++){
if(nums[i] < min){
min = nums[i];
}
}
return min;
}
}
2.使用二分查找法
// 寻找最小元素
public static int getMin(int[] nums) {
/*
* 方法2:二分查找法
*/
int low = 0;
int hi = nums.length - 1;
int mid;
while (low < hi) {
mid = (low + hi) / 2;
if (nums[mid] < nums[hi]) {
// 则mid到hi处为最小值的右半部分,可忽略该区间,改变hi位置,缩小区间
hi = mid;// 不能等于mid-1,否则如果nums[mid]恰好为最小值,就漏掉了
} else {
// 因为不存在重复元素,且nums[mid] == nums[hi]时已经跳出循环了。因此没有nums[mid] == nums[hi]的情况;
low = mid + 1;
}
}
return nums[low];
}