zoukankan      html  css  js  c++  java
  • 0081. Search in Rotated Sorted Array II (M)

    Search in Rotated Sorted Array II (M)

    题目

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

    (i.e., [0,0,1,2,2,5,6] might become [2,5,6,0,0,1,2]).

    You are given a target value to search. If found in the array return true, otherwise return false.

    Example 1:

    Input: nums = [2,5,6,0,0,1,2], target = 0
    Output: true
    

    Example 2:

    Input: nums = [2,5,6,0,0,1,2], target = 3
    Output: false
    

    Follow up:

    • This is a follow up problem to Search in Rotated Sorted Array, where nums may contain duplicates.
    • Would this affect the run-time complexity? How and why?

    题意

    将一非递减数列的随机后半部分与前半部分换位,得到新数组,在新数组中查找目标值。

    思路

    33. Search in Rotated Sorted Array 相比,允许数组中存在重复的值,这带来的问题是,很难根据一个元素与最左侧元素的大小关系来判断它是落在左区间还是右区间,如数组 [2, 2, 2, 3, 4, 5, 2, 2]。

    因此在 33. Search in Rotated Sorted Array 解法的基础上做出改动:只有当nums[mid]与nums[left]存在严格的大于小于关系时,才能确定mid是落在左区间还是右区间,而当nums[mid]等于nums[left]时,因为无法有效判断区间归属,只能令left右移(或者right左移)。在最坏情况下(全元素一样),时间复杂度退化至(O(N))


    代码实现

    Java

    class Solution {
        public boolean search(int[] nums, int target) {
            if (nums.length == 0) {
                return false;
            }
    
            int left = 0, right = nums.length - 1;
    
            while (left <= right) {
                int mid = (left + right) / 2;
                if (nums[mid] == target) {
                    return true;
                }
                // 只有严格的大于小于关系才能明确判断落在左区间还是右区间
                if (nums[mid] > nums[left]) {
                    if (target >= nums[left] && target < nums[mid]) {
                        right = mid - 1;
                    } else {
                        left = mid + 1;
                    }
                } else if (nums[mid] < nums[left]) {
                    if (target <= nums[right] && target > nums[mid]) {
                        left = mid + 1;
                    } else {
                        right = mid - 1;
                    }
                } else {
                    left++;
                }
            }
    
            return false;
        }
    }
    

    JavaScript

    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {boolean}
     */
    var search = function (nums, target) {
      let left = 0, right = nums.length - 1
    
      while (left <= right) {
        let mid = Math.trunc((right - left) / 2) + left
    
        if (nums[mid] == target) {
          return true
        }
    
        if (nums[mid] > nums[left] && target >= nums[left] && target < nums[mid]) {
          right = mid - 1
        } else if (nums[mid] > nums[left]) {
          left = mid + 1
        } else if (nums[mid] < nums[left] && target <= nums[right] && target > nums[mid]) {
          left = mid + 1
        } else if (nums[mid] < nums[left]) {
          right = mid - 1
        } else {
          left++
        }
      }
    
      return false
    }
    
  • 相关阅读:
    Java实现“睡排序”——线程池Executors的使用
    浅谈HashMap与线程安全 (JDK1.8)
    Ubuntu 16 Java Develop环境快速搭建
    Spring Boot在反序列化过程中:jackson.databind.exc.InvalidDefinitionException cannot deserialize from Object value
    Java 8 – Map排序
    vue指令优化网络图片加载速度
    如何实现小于12px的字体效果
    两种以上方式实现已知或者未知宽度的垂直水平居中
    C# winform窗体间传值(使用委托或事件)
    C#栈Stack的使用
  • 原文地址:https://www.cnblogs.com/mapoos/p/14012593.html
Copyright © 2011-2022 走看看