81. Search in Rotated Sorted Array II

本文介绍了一种在旋转过的有序数组中查找特定元素的方法。通过改进的二分查找算法实现高效搜索,即使数组中存在重复元素也能正确处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  • 题目大意:给定一个旋转后的数组,写一个函数,判断给定的数,是否在数组中。

  • 思路:

    1. 直接遍历数组,判断是否有target,时间复杂度O(N)。
    2. 二分查找,查找目标数,时间复杂度O(logN).
  • 代码:

    package Array;
    
    
    
    /**
    * @Author OovEver
    * @Date 2017/11/28 10:10
    */
    public class Solution {
      public boolean search(int[] nums, int target) {
          int start = 0, end = nums.length - 1, mid = -1;
          while(start <= end) {
              mid = (start + end) / 2;
              if (nums[mid] == target) {
                  return true;
              }
              //If we know for sure right side is sorted or left side is unsorted
              if (nums[mid] < nums[end] || nums[mid] < nums[start]) {
                  if (target > nums[mid] && target <= nums[end]) {
                      start = mid + 1;
                  } else {
                      end = mid - 1;
                  }
                  //If we know for sure left side is sorted or right side is unsorted
              } else if (nums[mid] > nums[start] || nums[mid] > nums[end]) {
                  if (target < nums[mid] && target >= nums[start]) {
                      end = mid - 1;
                  } else {
                      start = mid + 1;
                  }
                  //If we get here, that means nums[start] == nums[mid] == nums[end], then shifting out
                  //any of the two sides won't change the result but can help remove duplicate from
                  //consideration, here we just use end-- but left++ works too
              } else {
    //                low++也可以
                  end--;
              }
          }
    
          return false;
      }
    
    }
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值