当前位置: 首页 > news >正文

【leetcode hot 100 34】在排序数组中查找元素的第一个和最后一个位置

解法一:先用二分查找找到最左边的target,再顺序寻找最右边的target。

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int n=nums.length;
        if(n==0){
            return new int[]{-1, -1};
        }
        int left=0, right=n-1, ret = n;
        while(left<=right){
            int mid = (left+right)/2; //取中间或者中间左边的那个数
            if(nums[mid]>=target){
                ret=mid; // 取到最左边的target
                right = mid-1;
            }
            else{
                left = mid+1;
            }
        }
        if(ret>=n){
            return new int[]{-1, -1};
        }
        if(nums[ret]==target){
            int i=ret+1;
            while(i<n){
                if(nums[i]!=target){
                    break;
                }
                i++;
            }
            return new int[]{ret, i-1};
        }
        return new int[]{-1, -1};
    }
}

注意:

  • int mid = (left+right)/2 每次都取中间或者中间左边的那个数
  • ret=mid 每次都取到最左边的target
  • if(n==0){ return new int[]{-1, -1}; } 应对 nums=[] 的情况
  • if(ret>=n){ return new int[]{-1, -1}; } 应对 target 应该在n位置上的情况

错误原因:时间复杂度应该为O(logn+n)

解法二:传入参数bool,确定每次取最左边的target还是取最右边的target

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int leftIdx = binarySearch(nums, target, true);
        int rightIdx = binarySearch(nums, target, false) - 1;
        if (leftIdx <= rightIdx && rightIdx < nums.length && nums[leftIdx] == target && nums[rightIdx] == target) {
            return new int[]{leftIdx, rightIdx};
        } 
        return new int[]{-1, -1};
    }

    public int binarySearch(int[] nums, int target, boolean lower) {
        int left = 0, right = nums.length - 1, ans = nums.length;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] > target || (lower && nums[mid] >= target)) {
                right = mid - 1;
                ans = mid;
            } else {
                left = mid + 1;
            }
        }
        return ans;
    }
}

相关文章:

  • LLM-01-第一章-预训练/神经网络的激活函数(一)概述
  • 信息安全和病毒防护——非对称加密和对称加密
  • 在 SaaS 应用上构建 BI 能力的实战之路
  • Ciallo~ (∠・ω< )⌒★
  • 【redis】主从复制:单点问题、配置详解、特点详解
  • 阻塞队列:原理、应用及实现
  • 第十六届蓝桥杯康复训练--8
  • 学习记录-vue2,3-vue实现tab栏
  • 齿轮啮合频率计算及其频谱图
  • [C语言基础] 第2章 算法的概念
  • kube-score K8S Yaml静态代码分析工具详解
  • 【申论】规范表达-科技创新类
  • 【Python自动化测试】——自动化测试基础
  • ABC392题解
  • 力扣算法ing(36 / 100)
  • 神经网络知识点整理
  • 中间件漏洞—Apache
  • 在线监测工具介绍 -- Arthas
  • 探索CSS3中那些不常用但特别强大的属性和属性值
  • JavaScript 比较运算符
  • 48岁黄世芳履新中国驻毛里求斯大使,曾在广西工作多年
  • 山大齐鲁医院通报“子宫肌瘤论文现男性患者”:存在学术不端
  • 17家城商行去年年报盘点:西安银行营收增速领跑,青岛银行净利增速领跑
  • AI世界的年轻人|研究不止于实验室,更服务于遥远山区
  • 武契奇目前健康状况稳定,短期内将暂停日常工作
  • 印度宣布即日起对所有巴基斯坦航班关闭领空