AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

LeetCode 81. 搜索旋转排序数组 II    原题链接    中等

作者: 作者的头像   来颗方糖 ,  2025-03-18 14:29:14 · 天津 ,  所有人可见 ,  阅读 1


0


两种写法,还是有一些细节不一样的。

// LC 78 搜索旋转数组Ⅱ medium 2025年3月18日
    // 第一种写法 找右半段区间的最小值
    public boolean search(int[] nums, int target) {
        int n = nums.length;
        if(n==0) return false;
        if(n==1) return nums[0] == target;
        int R = n-1;
        while(R>0 && nums[R] == nums[0]) R--;
        n = R;
        int l = 0, r = n;
        // 寻找右半段区间的最小值
        while(l<r){
            int mid = l+r>>1;
            if(nums[mid]<=nums[R]) r=mid;
            else l=mid+1;
        }
        if(target<= nums[R]){
            r=R;
        }else{
            l = 0; r -- ;
        }
        while(l<r){
            int mid = l+r>>1;
            if(nums[mid]>= target) r= mid;
            else l = mid+1;
        }
        return nums[l] == target;
    }
    // 第二种写法 找左半段区间的最大值
    public boolean search(int[] nums, int target) {
        int n = nums.length;
        if(n==0) return false;
        if(n==1) return nums[0] == target;
        int R = nums.length-1;
        while(R>0 && nums[R] == nums[0]) R--;
        int l = 0, r = R;
        // 寻找左半段区间的最大值
        while(l<r){
            int mid = l+r+1>>1;
            if(nums[mid]>= nums[0]) l=mid;
            else r = mid-1;
        }
        if(target>= nums[0]){
            l=0;
        }else{//输入是[1,3] t=0时。l会被赋值成2,超出范围。所以最后一行只能取nums[r]
            l++;
            r=R;
        }
        while(l<r){
            int mid = l+r>>1;
            if(nums[mid]>= target) r = mid;
            else l = mid+1;
        }
        return nums[r] == target;// 这里只能写r了
    }

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息