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

LeetCode 81. Search in Rotated Sorted Array II(在旋转有序序列中搜索之二)的更多相关文章

  1. [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索之二

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

  2. [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索 II

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

  3. [LeetCode] Search in Rotated Sorted Array II 在旋转有序数组中搜索之二

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

  4. LeetCode 33. Search in Rotated Sorted Array(在旋转有序序列中搜索)

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

  5. LeetCode 81 Search in Rotated Sorted Array II(循环有序数组中的查找问题)

    题目链接:https://leetcode.com/problems/search-in-rotated-sorted-array-ii/#/description   姊妹篇:http://www. ...

  6. leetCode 81.Search in Rotated Sorted Array II (旋转数组的搜索II) 解题思路和方法

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

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

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

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

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

  9. [leetcode]81. Search in Rotated Sorted Array II旋转过有序数组里找目标值II(有重)

    This is a follow up problem to Search in Rotated Sorted Array, where nums may contain duplicates. 思路 ...

随机推荐

  1. python实例编写(2)--等待,一组对象,层级元素,frame对象处理

    一.设置等待 #coding=utf-8 from selenium import webdriver from selenium.webdriver.support.ui import WebDri ...

  2. OSGi-入门篇之生命周期层(03)

    前言 生命周期层在OSGi框架中属于模块层上面的一层,它的运作是建立在模块层的功能之上的.生命周期层一个主要的功能就是让你能够从外部管理应用或者建立能够自我管理的应用(或者两者的结合),并且给了应用本 ...

  3. 深入理解分布式调度框架TBSchedule及源码分析

    简介 由于最近工作比较忙,前前后后花了两个月的时间把TBSchedule的源码翻了个底朝天.关于TBSchedule的使用,网上也有很多参考资料,这里不做过多的阐述.本文着重介绍TBSchedule的 ...

  4. linux加载与使用ko驱动

    linux驱动和有两种形式: 1:编译到内核 2:编译为ko模块 这里记录下ko模块使用方法. 首先cd到/var/lib/(内核版本)/drivers/ 在这里面找到要装载的模块ko文件 modpr ...

  5. 西邮linux兴趣小组2014纳新免试题(一)

    [第一关] 题目 0101001001100001011100100010000100011010000001110000000011001111100100000111001100000000000 ...

  6. Mysql查询优化小结

    转自http://www.cnblogs.com/112ba/p/6220650.html 数据类型 简单原则:更小更好,简单就好,避免NULL1)整型如int(10)括号中的值与存储大小无关2)实数 ...

  7. 代理模式与java中的动态代理

    前言    代理模式又分为静态代理与动态代理,其中动态代理是Java各大框架中运用的最为广泛的一种模式之一,下面就用简单的例子来说明静态代理与动态代理. 场景    李雷是一个唱片公司的大老板,很忙, ...

  8. Dubbo服务集群、服务启动依赖检查

    一.什么叫Dubbo服务集群 指把同一个服务部署到多台机器,然后通过Dubbo服务集群的容错配置实现一台机器的服务挂掉之后自动切换到另外的一台机器 二.Dubbo服务集群容错配置--集群容错模式 标签 ...

  9. 深入理解C# 静态类与非静态类、静态成员的区别 [转载]

    静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...

  10. Redis Windows版安装详解

    一.下载Redis Redis下载有两个途径一是官网.二是Github,由于Redis官方只支持Linux系统,所以官网是没有Windows版本的,不过微软开源团队维护了一份所以我们可以使用这个. 官 ...