题目:

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

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

Write a function to determine if a given target is in the array.

题解:

这道题与之前Search in Rotated Sorted Array类似,问题只在于存在dupilcate。那么和之前那道题的解法区别就是,不能通过比较A[mid]和边缘值来确定哪边是有序的,会出现A[mid]与边缘值相等的状态。所以,解决方法就是对于A[mid]==A[low]和A[mid]==A[high]单独处理。

当中间值与边缘值相等时,让指向边缘值的指针分别往前移动,忽略掉这个相同点,再用之前的方法判断即可。

这一改变增加了时间复杂度,试想一个数组有同一数字组成{1,1,1,1,1},target=2, 那么这个算法就会将整个数组遍历,时间复杂度由O(logn)升到O(n)

实现代码如下:

  1.  1     public boolean search(int [] A,int target){
  2.  
  3.  2        if(A==null||A.length==0)
  4.  
  5.  3          return false;
  6.  
  7.  4         
  8.  
  9.  5        int low = 0;
  10.  
  11.  6        int high = A.length-1;
  12.  
  13.  7       
  14.  
  15.  8        while(low <= high){
  16.  
  17.  9            int mid = (low + high)/2;
  18.  
  19.             if(target < A[mid]){
  20.  
  21.                 if(A[mid]<A[high])//right side is sorted
  22.  
  23.                   high = mid - 1;//target must in left side
  24.  
  25.                 else if(A[mid]==A[high])//cannot tell right is sorted, move pointer high
  26.  
  27.                   high--;
  28.  
  29.                 else//left side is sorted
  30.  
  31.                   if(target<A[low])
  32.  
  33.                      low = mid + 1;
  34.  
  35.                   else 
  36.  
  37.                      high = mid - 1;
  38.  
  39.             }else if(target > A[mid]){
  40.  
  41.                 if(A[low]<A[mid])//left side is sorted
  42.  
  43.                   low = mid + 1;//target must in right side
  44.  
  45.                 else if(A[low]==A[mid])//cannot tell left is sorted, move pointer low
  46.  
  47.                   low++;
  48.  
  49.                 else//right side is sorted
  50.  
  51.                   if(target>A[high])
  52.  
  53.                      high = mid - 1;
  54.  
  55.                   else
  56.  
  57.                      low = mid + 1;
  58.  
  59.             }else
  60.  
  61.               return true;
  62.  
  63.         }
  64.  
  65.         
  66.  
  67.         return false;
  68.  
  69.  } 

Reference: http://blog.csdn.net/linhuanmars/article/details/20588511

Search in Rotated Sorted Array II leetcode java的更多相关文章

  1. Search in Rotated Sorted Array II leetcode

    原题链接,点我 该题解题参考博客 和Search in Rotated Sorted Array唯一的区别是这道题目中元素会有重复的情况出现.不过正是因为这个条件的出现,出现了比较复杂的case,甚至 ...

  2. Search in Rotated Sorted Array II——LeetCode

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

  3. LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++>

    LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++> 给出排序好的一维有重复元素的数组,随机取一个位置断开 ...

  4. LeetCode: Search in Rotated Sorted Array II 解题报告

    Search in Rotated Sorted Array II Follow up for "LeetCode: Search in Rotated Sorted Array 解题报告& ...

  5. LeetCode OJ:Search in Rotated Sorted Array II(翻转排序数组的查找)

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

  6. 【leetcode】Search in Rotated Sorted Array II

    Search in Rotated Sorted Array II Follow up for "Search in Rotated Sorted Array":What if d ...

  7. 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 ...

  8. 【LeetCode】81. Search in Rotated Sorted Array II (2 solutions)

    Search in Rotated Sorted Array II Follow up for "Search in Rotated Sorted Array":What if d ...

  9. 33. Search in Rotated Sorted Array & 81. Search in Rotated Sorted Array II

    33. Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some piv ...

随机推荐

  1. key Value

    key 存值的编号 value 存放的数据 看来key 和value 可以为null~   public class Dog { private int id; private String name ...

  2. 深入理解ajax系列第七篇

    前面的话 虽然ajax全称是asynchronous javascript and XML.但目前使用ajax技术时,传递JSON已经成为事实上的标准.因为相较于XML而言,JSON简单且方便.本文将 ...

  3. django中缓存配置

    # ======缓存配置====== CACHES = { ## 虚拟缓存,开发调试版本,此为开始调试用,实际内部不做任何操作 # 'default': { # 'BACKEND': 'django. ...

  4. 【BZOJ 4558】 4558: [JLoi2016]方 (计数、容斥原理)

    未经博主同意不能转载 4558: [JLoi2016]方 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 362  Solved: 162 Descri ...

  5. centOS7下SVN的安装和使用

    1. 安装 CentOS通过yum安装subversion. # yum install subversion  subversion安装在/bin目录: # which svnserve #查看目录 ...

  6. JavaSE基础之JDBC

    JavaSE基础之JDBC 1.JDBC 的步骤: ①加载数据库驱动: a.MySQL:com.mysql.jdbc.Driver: b.SQLServer:com.microsoft.jdbc.sq ...

  7. Lost connection to MySQL server at 'reading initial communication packet', system error: 0的一个解决方案

    -A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT在icmp之前/etc/init.d/iptables restar ...

  8. [POI2015]Pieczęć

    [POI2015]Pieczęć 题目大意: 一张\(n\times m(n,m\le1000)\)的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色. 你有一个\(a\times b(a,b\l ...

  9. SpringBoot静态资源目录

    在web开发中,静态资源的访问是必不可少的,如:图片.js.css 等资源的访问. SpringBoot对静态资源访问提供了很好的支持,基本使用默认配置就能满足开发需求. 在传统的web项目中静态资源 ...

  10. Elasticsearch 横向扩容以及容错机制

    写在前面的话:读书破万卷,编码如有神-------------------------------------------------------------------- 参考内容: <Ela ...