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

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

Suppose an array sorted in ascending order 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).

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

The array may contain duplicates.


题目标签:Array

  这道题目给了我们一个有序的array,其中是可以有重复的数字,让我们判断 target 是否在array里。这道题目和之前的那题基本思路一样,但是这里多了重复的数字,大部分情况下,不影响我们的程序,但是当我们遇到这种情况: 1,3,1,1,1  target = 3 当很多的重复数字rotate到了右边,并且占据了中间的位置,此时,我们就不能够判断出,应该选左边还是右边继续搜索了,因为mid == left 也 == right。所以我们要多加一个条件,把这种情况考虑进去,并且修改之前的条件。

  case 1: 如果left 小于 mid, 说明 左边是有序 array;

  case 2: 如果left 大于 mid, 说明 右边是有序 array;

  case 3: 如果left 等于 mid, 而且当它们不在同一位置的时候,说明 mid 和 left 是重复项,并且右边应该全是重复项,此时可以把 left++,目的是让left 跳出重复项的范围。

                 这里只能left++, 而不能right--,(针对于我的code),因为当 left 等于 mid, 而且它们在同一位置的话,我们来看例子 1,3  target 是3的话:

        left 指向1, mid 指向1, right 指向3, 这里left 和 mid 重合了,而且我们每次遇到这种情况都是先 test left 的这一边,所以就要让left往右shift。

Java Solution:

Runtime beats 15.21%

完成日期:08/01/2017

关键词:Array

关键点:利用Binary Search 结合 rotated sorted array 中必然有一半是有序序列 来搜索;当middle 等于 left 的情况下,让left++ 来跳出重复的数字范围

 public class Solution
{
public boolean search(int[] nums, int target)
{
if(nums == null || nums.length == 0)
return false; int left = 0;
int right = nums.length - 1; while(left <= right)
{
int mid = left + (right - left) / 2; if(nums[mid] == target) // if the middle is the target, return true
return true;
else if(nums[left] < nums[mid]) // meaning left half is ascending order
{
if(target >= nums[left] && target < nums[mid]) // is target is in left half
right = mid - 1; // move to left half to search
else // target is in right half
left = mid + 1; // move to right half to search
}
else if(nums[left] > nums[mid])// meaning right half is ascending order
{
if(target > nums[mid] && target <= nums[right]) // if target is in right half
left = mid + 1;
else // target is in left half
right = mid - 1;
}
else
left++;
} return false;
}
}

参考资料:N/A

LeetCode 算法题目列表 - LeetCode Algorithms Questions List

最新文章

  1. VS2010+Qt+OpenCv(显示图像)
  2. LeetCode - 207. Course Schedule
  3. win7左ctrl和左alt键互换
  4. BGP学习笔记
  5. AJAX请求也会重新刷新整个页面?
  6. centos nginx install openssl
  7. @JoinTable和@JoinColumn
  8. HDU - 2276 Kiki &amp;amp; Little Kiki 2
  9. 科技股晴间多云 阿里京东IPO或受影响
  10. 集合框架(HashSet存储自定义对象保证元素唯一性)
  11. Centos7安装Redis3.2.8
  12. Laravel5中通过SimpleQrCode扩展包生成二维码实例
  13. LINQ交集/并集/差集/去重
  14. Centos 7 修改系统时区
  15. linux 查看路由表
  16. [02] Spring主要功能模块概述
  17. BZOJ1607 [Usaco2008 Dec]Patting Heads 轻拍牛头 筛法
  18. C++学习知识点
  19. Cocos2d-x-Lua演示样例项目HelloLua
  20. python编码(一)

热门文章

  1. MySQL集群(一)之主从复制
  2. D3--数据可视化实战总结
  3. IDEA 2 的注册码
  4. Python循环列表删除元素问题
  5. Check for Palindromes-FCC
  6. fitnesse - Variables and Symbols
  7. 对python编程的初步理解
  8. svn服务端安装、权限修改以及客户端的使用
  9. ZOJ2185 简单分块 找规律
  10. MVC中Controller控制器相关技术