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. ASP.NET Core: Getting Started with ASP.NET MVC Core

    1. ASP.NET Core the Unified Framework ASP.NET Core的统一框架 2. New Solution Project 新的解决方案项目 src folder: ...

  2. centos 6.5 安装mysql 5.6错误

    yum list libaio yum install libaio.i686 yum list glibc* yum install glibc.i686 yum list libstdc++* y ...

  3. 面试题-JDBC

    1.什么是JDBC? JDBC是允许用户在不同数据库之间做选择的一个抽象层.JDBC允许开发者用JAVA写数据库应用程序,而不需要关心底层特定数据库的细节. 2.解释下驱动(Driver)在JDBC中 ...

  4. deployd使用归纳

    deployd:一个生成后端数据的软件,简单的说就是大部分的前端不会后端,即使会也很难在深入到数据库进行设置一些前端所需数据的创建与查询的后端程序的书写,所以此时就是deployd大显身手的时候了. ...

  5. linux 下查看cpu是几核的

    几个cpu more /proc/cpuinfo |grep "physical id"|uniq|wc -l 每个cpu是几核(假设cpu配置相同) more /proc/cpu ...

  6. layoutSubviews在什么情况下会被调用

    layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubviews. 2.addSubview会触发layoutSubviews. 3.设置view的Frame ...

  7. 5.MyBaits调用存储过程

    1.创建一个javaweb项目MyBatis_Part4_Procedure 2.在src下创建procedure.sql文件 --创建表 create table p_user( id number ...

  8. nfs 搭建

    nfs 搭建yum install nfs-utils rpcbind 修改配置文件 /etc/exports格式 每个共享的文件系统需要独立一行目录客户端主机列表需要使用空格隔开配置文件中支持通配符 ...

  9. Sql Server尝试读取或写入受保护的内存。这通常指示其他内存已损坏

    今日遇到这样一个问题,用vs2010调试C#代码时,只要代码一运行到跟数据库关联的地方时,编译器就报错误,给的提示如:调试器已附加,要继续需要分离什么的,咋一看还以为是vs中调试器设置的问题,可后来仔 ...

  10. 实战JAVA虚拟机 JVM故障诊断与性能优化 pdf

    需要的小伙伴拿走,百度云盘:http://pan.baidu.com/s/1nvm6RHZ