旋转数组的最小数字 leetcode 补充版本

62 篇文章 0 订阅
37 篇文章 0 订阅

题目:https://blog.csdn.net/nsjlive/article/details/87652925

在leetcode中,几个测试例子:indexMid=2; 说明又重复值的情况下,https://blog.csdn.net/nsjlive/article/details/87652925的解答在数组存在重复元素的情况下失效

if(array[indexMid]>=array[low]){
                low=indexMid;       //反例:[10,1,10,10,10]  ,找不到最小值

else if(array[indexMid]<=array[high]){
                high=indexMid;
            }  //反例:[2,2,2,0,2]    根本找不到最小值

 

参考leetcode :

Find Minimum in Rotated Sorted Array II (154,Hard)    该数组可能包含重复项。

153. Find Minimum in Rotated Sorted Array (mediun)   您可以假设数组中不存在重复。

 

好的解法,自然是考虑数组中可能包含重复项。 

定义:旋转数组前,Minimum是数组的第一个元素。

数组旋转前,前半部分为part1,后半部分为part2,显然part1<=part2;

数组旋转后,part2在前,part1在后。 

分析:

1)   if(nums[mid] > nums[high])     //[2,2,2,0,1]  

nums[high]]属于part1 最小值也在part1   假设 nums[mid]属于part1,则nums[mid] <=nums[high] 
假设不成立, 说明nums[mid]一定属于part2, 而Minimum在part1  ,继续往后面查找即可 ; low = mid + 1; 

2)   if(nums[mid] == nums[high])   // 例如  [10,1,10,10,10] 

不能判断  nums[mid]属于part1还是属于part2,但可以确定的是,nums[mid]出现了多次,题目要求寻找最小的数,如果nums[mid]==Minimum ,出现多次,可以舍掉最后一个,继续查找  high = high - 1   ;

3) if(nums[mid] < nums[high])   

 说明nums[mid]一定属于part1,往前面查找即可。   high = mid;   

例如  [10,1,1,10,10] 

public int findMin(int[] nums) {
       int low = 0 ; 
       int high =nums.length - 1; 

 while(low < high){
            int mid = low + (high - low) / 2;        
            if(nums[mid] > nums[high]){//说明nums[mid]一定属于part2,继续往后面查找即可
                low = mid + 1;
            }else if(nums[mid] == nums[high]){
                high = high - 1;//说明该数字出现多次,舍弃掉最后一个,继续查找 
            }else{//说明nums[mid]属于part1
                high = mid;
            }   
        }
        return nums[low];
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值