2021-08-17

寻找旋转排序数组中的最小值

已知一个长度为 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];
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值