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

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

请找出其中最小的元素

注意数组中可能存在重复的元素。

示例 1:

输入: [1,3,5]
输出: 1

示例 2:

输入: [2,2,2,0,1]
输出: 0
代码实现一:
public int findMin(int[] nums)
{
   int left = 0;
   int right = nums.length - 1;
   while (left <= right)
   {
       int mid = left + (right - left) / 2;
       if (nums[mid] > nums[right])
           left = mid + 1;
       else if (nums[mid] < nums[left])
           right = mid;
       else
           right--;
   }
   return nums[left];
}
代码实现二 :与寻找旋转排序数组中的最小值类似的解法
public int findMin(int[] nums)
{
   if (nums.length == 1)
       return nums[0];
   if (nums.length == 2)
       return nums[0] < nums[1] ? nums[0] : nums[1];
   if (nums[0] < nums[nums.length - 1])
       return nums[0];

   int left = 0;
   int right = nums.length - 1;
   int min = nums[0];

   while (left <= right)
   {
       int mid = left + (right - left) / 2;
       if (mid >= 1 && (mid + 1) < nums.length && nums[mid] < nums[mid + 1] && nums[mid] < nums[mid - 1])
           return nums[mid];
       else if (left >= 1 && (left + 1) < nums.length && nums[left] < nums[left - 1] && nums[left] < nums[left + 1])
           return nums[left];
       else if (right >= 1 && (right + 1) < nums.length && nums[right] < nums[right - 1] && nums[right] < nums[right + 1])
           return nums[right];
       else if (nums[mid] > nums[0])
       {
           if (nums[mid] < min)
               min = nums[mid];
           left = mid + 1;
       }
       else if (nums[mid] < nums[0])
       {
           if (nums[mid] < min)
               min = nums[mid];
           right = mid - 1;
       }
       else
       {
           if (nums[mid] < min)
               min = nums[mid];
           left++;
       }
   }

   if (min > nums[nums.length - 1])
       min = nums[nums.length - 1];
   if (min > nums[1])
       min = nums[1];
   if (min > nums[nums.length - 2])
       min = nums[nums.length - 2];

   return min;
}
主函数:
public static void main(String[] args)
{
   S6 s = new S6();
   int[] res1 = new int[]{1,3,5};
   int[] res2 = new int[]{2,0,0,0,1,2};
   int[] res3 = new int[]{2,2,2,0,1};
   System.out.println(s.findMin(res1));
   System.out.println(s.findMin(res2));
   System.out.println(s.findMin(res3));
}
运行结果:

1
0
0

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值