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