zoukankan      html  css  js  c++  java
  • Search in Rotated Sorted Array II

    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.

    Analyse: binary search. 

    Runtime: 10ms. 

     1 class Solution {
     2 public:
     3     int findMin(vector<int>& nums) {
     4         if(nums.empty()) return 0;
     5         
     6         int low = 0, high = nums.size() - 1;
     7         while(low < high) {
     8             int mid = low + (high - low) / 2;
     9             
    10             if(nums[mid] > nums[high]) low = mid + 1;
    11             else if(nums[mid] < nums[high]) high = mid;
    12             else high--;
    13         }
    14         return nums[high];
    15     }
    16 };

    分析:当允许有重复元素出现的时候,那么Search in Rotated Sorted Array中line14:nums[low] <= nums[mid]所能决定的序列就并非单调递增序列,例如[3,1,3,3,3]。在这种情形下,只需将原来的条件拆分为两种情形:

    1. nums[low] < nums[mid] 那么之间的序列一定是递增的,代码为Search in Rotated Sorted Array中的line14~17

    2. nums[low] == nums[mid] 由于不能够判断数字到底在何处增加、减少,进行low++后观察。因为low++之后nums[low]一定会变大或者保持不变,变大即满足nums[low] > nums[mid],不变则表示已经进入到重复数字区域。

    运行时间 11ms

     1 class Solution {
     2 public:
     3     bool search(vector<int>& nums, int target) {
     4         if(nums.size() == 0) return false;
     5         if(nums.size() == 1){
     6             if(nums[0] == target) return true;
     7             else return false;
     8         }
     9         
    10         int low = 0, high = nums.size()-1;
    11         while(low <= high){
    12             int mid = (low + high) / 2;
    13             if(nums[mid] == target) return true;
    14             if(nums[low] < nums[mid]){
    15                 if(nums[low] <= target && target < nums[mid]) high = mid - 1;
    16                 else low = mid + 1;
    17             }
    18             else if(nums[low] > nums[mid]){
    19                 if(nums[mid] < target && target <= nums[high]) low = mid + 1;
    20                 else high = mid - 1;
    21             }
    22             else low++;
    23         }
    24         return false;
    25     }
    26 };
  • 相关阅读:
    基于数据库的号段模式生成分布式ID
    【idea】实现接口方法的快捷键
    java下载文件代码示例
    使用easyexcel生成文件,下载文件示例
    【easyexcel】读取excel文件
    【easyexcel】生成excel文件
    JAXB常用注解详解
    【SoapUI】测试webservice接口步骤
    idea 默认全局配置maven,避免每次新建项目都需要指定自己的maven目录
    JAVA实现MD5加密
  • 原文地址:https://www.cnblogs.com/amazingzoe/p/4466444.html
Copyright © 2011-2022 走看看