首页 > 其他分享 >[LeetCode] LeetCode81. 搜索旋转排序数组II

[LeetCode] LeetCode81. 搜索旋转排序数组II

时间:2023-12-20 13:01:09浏览次数:31  
标签:right target nums int mid LeetCode81 II LeetCode left

题目描述

思路:是lc33.搜索旋转排序数组的延伸,允许包含重复元素

起初:

  • 当nums[left] <= nums[mid]时,区间[left,mid]有序
  • 当nums[left] > nums[mid]时,区间[mid ,right]有序

但是这个题目当nums[left] == nums[mid]时,无法判断哪个区间是有序的,无法判断target位于左侧还是右侧,此时无法缩小区间,退化为顺序查找,即在[left,right]区间上直接遍历每一项。

方法一:

class Solution {
    public boolean search(int[] nums, int target) {
        if (nums == null || nums.length == 0) return false;
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (target == nums[mid]) return true;
            if (nums[left] < nums[mid]) {
                if (nums[left] <= target && target < nums[mid]) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            } else if (nums[left] == nums[mid]) {
                for (int i = left; i <= right; i ++) {
                    if (target == nums[i]) return true;
                }
				// 如果顺序查找都没找到,说明不存在这个元素
                return false;
            } else if (nums[left] > nums[mid]){
                if (nums[mid] < target && target <= nums[right]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }
        return false;
    }
}

标签:right,target,nums,int,mid,LeetCode81,II,LeetCode,left
From: https://www.cnblogs.com/keyongkang/p/17916278.html

相关文章

  • [LeetCode Hot 100] LeetCode153. 寻找旋转排序数组中的最小值
    题目描述思路如果数组翻转后又回到升序的情况,即nums[left]<=nums[right],则nums[left]就是最小值,直接返回。如果数组翻转,需要找到数组中第二部分的第一个元素:若nums[left]<=nums[mid],说明区间[left,mid]连续递增,则最小元素一定不在这个区间里,可以直接排除,最小值在[......
  • Leetcode 044. 通配符匹配
    https://leetcode.cn/problems/wildcard-matching/description/给你一个输入字符串(s)和一个字符模式(p),请你实现一个支持'?'和'*'匹配规则的通配符匹配:'?'可以匹配任何单个字符。'*'可以匹配任意字符序列(包括空字符序列)。判定匹配成功的充要条件是:字符模式必须能够......
  • 代码随想录算法训练营第七天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和
    一、454.四数相加II题目链接:LeetCode454.四数相加II学习前:思路:首先定义两个HashMap对象record12和record34,对应的key存放两个数组元素的和,value存放计算的和出现的次数接着遍历record12,若record存在与之和为0的元素,则计算两个value相乘的结果,并进行累积,作为输出的结果......
  • [LeetCode] LeetCode704. 二分查找
    题目描述思路基础二分查找模板的考察。方法一:classSolution{publicintsearch(int[]nums,inttarget){if(nums==null||nums.length==0)return-1;intleft=0,right=nums.length-1;while(left<=right){......
  • [LeetCode Hot 100] LeetCode33. 搜索旋转排序数组
    题目描述思路如果nums[left]<=nums[mid],则[left,mid]有序如果nums[left]>nums[mid],则[mid,right]有序方法一:classSolution{publicintsearch(int[]nums,inttarget){if(nums==null||nums.length==0)return-1;intleft=0,ri......
  • [LeetCode Hot 100] LeetCode35. 搜索插入位置
    题目描述思路基础二分搜索模板本质:找到第一个大于等于target的元素的下标注意:该题目不存在重复元素存在一种特殊情况:target>nums的最大值,此时插入的位置正好是left的位置方法一:classSolution{publicintsearchInsert(int[]nums,inttarget){if......
  • [LeetCode Hot 100] LeetCode34.在排序数组中查找元素的第一个和最后一个位置
    题目描述思路:二分查找之寻找左右侧边界两个关键点:1.数组有序;2.时间复杂度O(logn)方法一:classSolution{publicint[]searchRange(int[]nums,inttarget){if(nums.length==0||nums==null){returnnewint[]{-1,-1};}......
  • 转换考勤系统中的数据(II)(Power Query)
    let源=Excel.CurrentWorkbook(){[Name="表1"]}[Content],添加姓名列=Table.AddColumn(源,"姓名",eachif[列10]="姓名:"then[列5]&[列11]elsenull),姓名列填充=Table.FillDown(添加姓名列,{"姓名"}),筛选掉不需要的行=Table.......
  • Maix II Dock 的USB OTG 及USB UART 测试
    1、通过USBOTG接口实现ADB的终端交互①、使用typeC数据线连接电脑和MaixIIDock板卡的USBOTG接口②、电脑弹窗并识别MaixIIDock板卡为一个“U盘”,如果提示U盘驱动有问题,请忽略。          ③、进入U盘可以看到对应的配置文件及一个app执......
  • 454.四数相加II
    题目454.四数相加II要求给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i,j,k,l) 能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0思考过程上来直接暴力破解,四层for循环,结果超时,代码如下:......