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

技术153. 寻找旋转排序数组中的最小值 153. 寻找旋转排序数组中的最小值描述
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums =

13.在旋转排序数组中找到最小值。

描述

长度为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]

请注意,在数组[a[0]、a[1]、a[2]之后,a[n-1]]旋转一次,结果是数组[a [n-1],a [0],a [1],a [2],a [n-1]。

给你一个数组nums,它的元素值彼此不同。它原本是一个按升序排列的数组,根据上面的情况旋转了几次。请查找并返回数组中最小的元素。

链接

53.求旋转排序数组中的最小值-LEET码(leetcode-cn.com)

解法:二分法

注意需要处理一下细节

1类解决方案{

2 public int FindMIn(int[]nums){ 0

3 int left=0,right=nums . length-1;

4 while(左右){ 0

5 int mid=左(右-左)/2;

7 //如果nums[mid]=nums[right],则表示nums[mid]左侧为上升区间,右侧为无序区间。

8 //那么最小值将是区间无序的区块。

9 if(nums[mid]=nums[right]) {

左10=中1;

11 }

12 /*由于nums[mid]可能是目标值,

13如果最小值是target,则nums[mid]=target,

14直接返回mid,这意味着右边界应该包含mid值*/

15 else {

16右=中;

17 }

18 }

19返回nums[左];

20 }

21 }

1类解决方案{

2 public int FindMIn(int[]nums){ 0

3 int left=0,right=nums . length-1;

4 while(左=右){ 0

5 int mid=左(右-左)/2;

7 //如果nums[mid]=nums[right],则表示nums[mid]左侧为上升区间,右侧为无序区间。

8 //那么最小值将是区间无序的区块。

9 if(nums[mid]=nums[right]) {

左10=中1;

11 }

12 /*由于nums[mid]可能是目标值,

13如果最小值是target,则nums[mid]=target,

14直接返回mid,这意味着右边界应该包含mid值*/

15 else {

16右=中;

17 }

18 }

19返回nums[左];

20 }

21 }

此时(while (left=right)),您需要返回数字[right]

1类解决方案{

2 public int FindMIn(int[]nums){ 0

3 int left=0,right=nums . length-1;

4 while(左=右){ 0

5 int mid=左(右-左)/2;

7 //如果nums[mid]=nums[right],则表示nums[mid]左侧为上升区间,右侧为无序区间。

8 //那么最小值将是区间无序的区块。

9 if(nums[mid]=nums[right]) {

左10=中1;

11 }

12 /*由于nums[mid]可能是目标值,

13如果最小值是target,则nums[mid]=target,

14直接返回mid,这意味着右边界应该包含mid值*/

15 else {

16右=中;

17 }

18 }

19返回nums[右];

20 }

21 }

总结

1.最小值将在中间无序区间的一侧,因此right=mid是起点。

2.while (left right),离开循环时是left=right,此时left=right=mid,可以返回numbers [left]也可以返回numbers[right];

但是当(left=right)时,输出循环是从左向右的,所以它应该返回数字[right]

请看下面的代码输出。

1类解决方案{

2 public int FindMIn(int[]nums){ 0

3 int left=0,right=nums . length-1;

4 while(左=右){ 0

5 int mid=左(右-左)/2;

7 //中文字幕仅供学习交流,严禁用于商业用途。中文字幕仅供学习交流,严禁用于商业用途。中文字幕仅供学习交流,严禁用于商业用途。中文字幕仅供学习交流,严禁用于商业用途。中文字幕仅供学习交流,严禁用于商业用途。中文字幕仅供学习交流,严禁用于商业用途

8/…在这种情况下

9 if(num[中]=num[右])

左10=中1;

11 }

12 /*吴登盛[中]吴登盛,

13目标、数字[中]=目标,

14日中午返国,右日终日终日终日终日终日止*/

15其它[

16右=中;

17 }

18系统。出去。println(' num[mid]: ' num[mid]);

19 }

20系统。出去。println(' num[left]: ' nums[left]);

21系统。出去。println(' num[right]: ' num[right]);

22

23返回n[右];

24 }

25 }

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/126077.html

(0)

相关推荐

  • Sentinel-Go 源码系列,二)|初始化流程和责任链设计模式

    技术Sentinel-Go 源码系列,二)|初始化流程和责任链设计模式 Sentinel-Go 源码系列(二)|初始化流程和责任链设计模式上节中我们知道了 Sentinel-Go 大概能做什么事情,最简

    礼包 2021年11月9日
  • 国际象棋怎么玩,磁石国际象棋磁性折叠怎么玩儿

    技术国际象棋怎么玩,磁石国际象棋磁性折叠怎么玩儿棋子和棋盘国际象棋由黑白两棋组成国际象棋怎么玩,执白先行,国际象棋的对局目的是把对方的国王将死。以下三点如果全行不通,国王就算将死:
    1.挡住“将军”的局势
    2.离开“将军

    生活 2021年10月23日
  • 分期付款手机,买手机分期付款流程是怎样的

    技术分期付款手机,买手机分期付款流程是怎样的首先自己需要在自己的支付方式中绑定银行卡,在手机分期的时候需要使用到自己的身份证来证明自己的身份,自己只需要携带自己的身份证以及银行卡到营业厅跟她说自己要办理分期付款的业务即可

    生活 2021年10月30日
  • javagetclass与classforname(javagetclass获取属性值)

    技术Java中的getClass()及getName()方法怎么使用本篇内容介绍了“Java中的getClass()及getName()方法怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就

    攻略 2021年12月22日
  • 生绿豆芽,家庭自己生绿豆芽的妙招

    技术生绿豆芽,家庭自己生绿豆芽的妙招炎热的夏天生绿豆芽,绿豆是解暑最好的食物之一,除了绿豆汤之外,还可以吃绿豆芽哦,夏天温度高,绿豆好出芽,那么在这里分享一下自己制作绿豆芽的妙招。1、绿豆两小把,洗净,加清水泡一晚上。2

    生活 2021年10月24日
  • 如何添加Lombok支持和使用Thymeleaf

    技术如何添加Lombok支持和使用Thymeleaf本篇文章给大家分享的是有关如何添加Lombok支持和使用Thymeleaf,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小

    攻略 2021年11月9日