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

LeetCode热题100记录-【二分查找】

二分查找

35.搜索插入位置
思考:二分查找+先判定边界条件
记录:不需要二刷

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left = 0,right = nums.length-1;
        if(nums[right] < target){
            return right+1;
        }
        if(nums[left] > target){
            return 0;
        }
        while(left < right){
            int middle = (left + right) / 2;
            if(nums[middle] < target){
                left++;
            }else if(nums[middle] > target){
                right--;
            }else{
                return middle;
            }
        }
        return left;
    }
}

74.搜索二维矩阵
思考:找到二维的二分查找规则,右上角往左是递减,往下是递增
记录:不需要二刷

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int i = 0,j = matrix[0].length-1;
        while(i <= matrix.length-1 && j >= 0){
            if(matrix[i][j] < target){
                i++;
            }else if(matrix[i][j] > target){
                j--;
            }else{
                return true;
            }
        }
        return false;
    }
}

34.在排序数组中查找元素的第一个和最后一个位置
思考:二分查找+找边界
记录:不需要二刷

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int left = 0,right = 0;
        while(right < nums.length){
            if(nums[left] == target){
                while(right < nums.length && nums[right] == target){
                    right++;
                }
                return new int[]{left,right-1};
            }else if(nums[left] < target){
                left++;
                right++;
            }else{
                return new int[]{-1,-1};
            }
        }
        return new int[]{-1,-1};
    }
}

33.搜索旋转排序数组
思考:如果用哈希,直接秒。如果按照题目初始想法,

  • mid在【断崖】左侧,则nums[left] <= target < nums[mid],可以收缩左边界
  • mid在【断崖】右侧,则nums[mid] < target <= nums[right],可以收缩右边界

记录:不需要二刷

class Solution {
    public int search(int[] nums, int target) {
        HashMap<Integer,Integer> hm = new HashMap<>();
        for(int i = 0;i < nums.length;i++){
            hm.put(nums[i],i);
        }
        if(hm.containsKey(target)){
            return hm.get(target);
        }
        return -1;
    }
}

153.搜索旋转排序数组中的最小值
思考:如果用内置api,直接秒
记录:不需要二刷

class Solution {
    public int findMin(int[] nums) {
        Arrays.sort(nums);
        return nums[0];
    }
}

4.寻找两个正序数组的中位数
思考:用一个大数组存这两个数组,然后return中间元素,注意可能会有小数所以除以2.0
记录:需要二刷

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int[] nums = new int[nums1.length + nums2.length];
        int p1 = 0,p2 = 0;
        for(int i = 0;i < nums.length;i++){
            if(p1 >= nums1.length){
                nums[i] = nums2[p2];
                p2++;
                continue;
            }
            if(p2 >= nums2.length){
                nums[i] = nums1[p1];
                p1++;
                continue;
            }
            if(nums1[p1] <= nums2[p2]){
                nums[i] = nums1[p1];
                p1++;
            }else{
                nums[i] = nums2[p2];
                p2++;
            }
        }
        if(nums.length % 2 != 0){
            return nums[nums.length / 2];
        }else{
            return (nums[nums.length/2-1] + nums[nums.length/2]) / 2.0;
        }
    }
}

相关文章:

  • 办公用品网站建设市场定位深圳网站seo服务
  • 武汉做网站的公司怎样搭建自己的网站
  • 莆田网站制作昆山网站制作哪家好
  • 电子商务网站建设精英房地产销售
  • 中山企业建站程序佛山外贸seo
  • vb语言做的网站苏州百度推广开户
  • 单片机软件设计文档模板
  • skynet.call使用详解
  • kafka 的存储文件结构
  • fpga系列 HDL:跨时钟域同步 4-phase handshake(四相握手通信协议,请求-确认机制)浅释与代码实现
  • Boost库搜索引擎项目(版本1)
  • Nodejs回调函数
  • 使用uglifyjs对静态引入的js文件进行压缩
  • 网络安全小知识课堂(十三)
  • css专题1-----给div盒子的边框添加阴影
  • 地质科研智能革命:当大语言模型“扎根”地质现场、大语言模型本地化部署与AI智能体协同创新实践
  • 项目管理中客户拒绝签字验收?如何处理和预防
  • ModelScope能干什么?
  • Java Comparable 接口详解
  • 在Windows搭建gRPC C++开发环境
  • 局域网访问 Redis 方法
  • springmvc:tomcat启动无报错但接口404问题排查
  • 国标GB28181视频平台EasyCVR顺应智慧农业自动化趋势,打造大棚实时视频监控防线
  • 2025上海CMEF:鱼跃以“AI+医疗”开启健康管理新纪元
  • java基础 流(Stream)
  • 按键++,--在操作uint8_t类型(一个取值为1~10的数)中,在LCD中显示两位数字问题