Follow up for "Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

The array may contain duplicates.


【题目分析】

与Find Minimum in Rotated Sorted Array题目相比,这个题目中数组元素可能是重复的。

【思路】

 在上一个题目中,我们使用二分查找来找到数组的断点,从而确定最小值的位置。在没有重复元素的时候,可以比较中间值和边界值的大小来判断中间值的位置(即位于数组的前半段还是后半段)从而确定最小值和中间值的位置关系。但是如果有重复元素的出现会导致我们无法确定中间值和最小值的位置关系,比如:[10,1,10,10]和[10,10,1,10],两个数组的中间值都是10,但是我们无法判断最小值在中间值的左边还是右边,因为这两种情况都有可能出现。但是我们可以确定的是,这种情况中间值的左边或者右边肯定有一段全为10,而最小值在另外一段。
1. 递归
如果出现上述情况,我们分别在中间值的左右两边进行查找,递归的好处是,即使需要对两段数组进行二分查找,但是整体的时间复杂度还是不错的。
2. 非递归,删除边界值
上诉情况中出现了中间值和边界值相等的情况,因此在删除边界值后的数组中进行查找并不会影响到我们的查找结果。

【java代码】非递归
 public class Solution {
public int findMin(int[] nums) {
int start=0,mid=0,end=nums.length-1;
while(start<end){
if(nums[start] < nums[end]) return nums[start]; mid=start+(end-start)/2;
if(nums[mid]>nums[end]) start=mid+1;
else if(nums[mid]==nums[end]) end--;
else end=mid;
}
return nums[start];
}
}
【java代码】递归
 public class Solution {
public int findMin(int[] nums) {
int len = nums.length;
if(len == 1) return nums[0]; return find(nums, 0, len-1);
} public int find(int nums[], int left, int right){
while(left < right){
if(nums[left] < nums[right]) return nums[left];
if(left == right - 1) return Math.min(nums[left], nums[right]); int mid = left + (right - left)/2;
if(nums[left] == nums[mid] && nums[mid] == nums[right])
return Math.min(find(nums, left, mid-1), find(nums, mid+1, right)); if(nums[left] <= nums[mid]) left = mid + 1;
else right = mid;
}
return nums[left];
}
}

LeetCode OJ 154. Find Minimum in Rotated Sorted Array II的更多相关文章

  1. 【LeetCode】154. Find Minimum in Rotated Sorted Array II 解题报告(Python)

    [LeetCode]154. Find Minimum in Rotated Sorted Array II 解题报告(Python) 标签: LeetCode 题目地址:https://leetco ...

  2. 【LeetCode】154. Find Minimum in Rotated Sorted Array II (3 solutions)

    Find Minimum in Rotated Sorted Array II Follow up for "Find Minimum in Rotated Sorted Array&quo ...

  3. 【刷题-LeetCode】154 Find Minimum in Rotated Sorted Array II

    Find Minimum in Rotated Sorted Array II Suppose an array sorted in ascending order is rotated at som ...

  4. leetcode 153. Find Minimum in Rotated Sorted Array 、154. Find Minimum in Rotated Sorted Array II 、33. Search in Rotated Sorted Array 、81. Search in Rotated Sorted Array II 、704. Binary Search

    这4个题都是针对旋转的排序数组.其中153.154是在旋转的排序数组中找最小值,33.81是在旋转的排序数组中找一个固定的值.且153和33都是没有重复数值的数组,154.81都是针对各自问题的版本1 ...

  5. LeetCode 新题: Find Minimum in Rotated Sorted Array II 解题报告-二分法模板解法

    Find Minimum in Rotated Sorted Array II Follow up for "Find Minimum in Rotated Sorted Array&quo ...

  6. [LeetCode] 154. Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二

      Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i. ...

  7. Java for LeetCode 154 Find Minimum in Rotated Sorted Array II

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  8. [LeetCode] 154. Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值 II

    Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...

  9. leetcode 154. Find Minimum in Rotated Sorted Array II --------- java

    Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...

随机推荐

  1. 反编译与调试APK

    0×01前言 这年头,apk全都是加密啊,加壳啊,反调试啊,小伙伴们表示已经不能愉快的玩耍了.静态分析越来越不靠谱了,apktool.ApkIDE.jd GUI.dex2jar等已经无法满足大家的需求 ...

  2. 【C#】面试题整理

    1.C#中类是否支持多继承?请说明原因.答:不支持,需要用接口来实现多继承 2.我们都知道一个类可以有多个构造函数,并且C#会在我们创建类的时候默认的提供一个无参的构造函数,当我实现了另外一个有参数的 ...

  3. Android studio自动删除没用的资源

    有时候我们添加的一些资源,如图片和一些没用的代码,以及在添加第三方库的时候我们只需要使用其中的一部分功能和一部分资源,那么这个时候如果靠我们手工去怕是非常难做的,尤其是项目大的时候,Android 团 ...

  4. web 服务器

    作为一个跨专业转行的我来说,对后台一团浆糊,最近在看php,学的进度比较慢 (1)ApacheApache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上.Apache ...

  5. 【IIS】windows2008 ii7 设置访问网站提示帐号密码登录

    3个步骤: 1.添加windows身份验证: windows2008默认是不启用的,需要我们自己去启动,在管理工具 - 服务器管理- 角色 ,拉下去,下面有个[添加角色服务],安全性- Windows ...

  6. html和html5学习

    html和html5学习 chorme.safari中的input或textarea html超链接(a)详细讲解 html5新增及删除标签 html表格 图片加alt属性 input的type属性 ...

  7. 洛谷-谁拿了最多奖学金-NOIP2005提高组复赛

    题目描述 Description 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1)     院士奖学金,每人8000元,期末平均成绩高于80分(>8 ...

  8. hibernate------->第一个程序

    今天学习hibernate . 创建User类: package com.hibernate; import java.util.Date; public class User { private I ...

  9. CNN计算过程

  10. centos6 + tomcat+ jdk配置步骤

    1. 获取tomcat, jdk安装文件 mkdir /media/smbdirmount -o username=pas,password=111111 //109.110.100.50/pas / ...