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

【JavaScript】LeetCode:71-75

文章目录

  • 71 搜索插入位置
  • 72 搜索二维矩阵
  • 73 在排序数组中查找元素的第一个和最后一个位置
  • 74 搜索旋转排序数组
  • 75 寻找旋转排序数组中的最小值

71 搜索插入位置

在这里插入图片描述

  • 二分查找
  • 在最后一轮比较中,mid所指向的值 > target,right往左收,此时left所指向的位置为按顺序插入的位置;mid所指向的值 < target,left往右收,此时left所指向的位置为按顺序插入的位置。综上所述,如果最后未找到target,则返回left。
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function(nums, target) {
    let left = 0;
    let right = nums.length - 1;
    while(left <= right){
        let mid = Math.floor((left + right) / 2);
        if(nums[mid] > target){
            right = mid - 1;
        }else if(nums[mid] < target){
            left = mid + 1;
        }else{
            return mid;
        }
    }
    return left;
};

72 搜索二维矩阵

在这里插入图片描述

  • 二分查找
  • 展平数组:Array.flat()。
  • 根据题意,把二维数组展平为一维数组后,该数组fmax为非严格递增序列,对fmax进行二分查找即可。
/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {boolean}
 */
var searchMatrix = function(matrix, target) {
    let fmax = matrix.flat();
    let left = 0;
    let right = fmax.length - 1;
    while(left <= right){
        let mid = Math.floor((left + right) / 2);
        if(fmax[mid] > target){
            right = mid - 1;
        }else if(fmax[mid] < target){
            left = mid + 1;
        }else{
            return true;
        }
    }
    return false;
};

73 在排序数组中查找元素的第一个和最后一个位置

在这里插入图片描述

  • 二分查找
  • 对数组进行两次二分查找,分别寻找target在数组中的第一个位置和最后一个位置。
  • 第一个位置:当mid所指向的位置 < target时,left往右收;当mid所指向的位置 >= target时,right往左收。因此到最后一轮查找时,如果mid所指向的位置为target,left所指向的位置就是左端点,即第一个位置。
  • 最后一个位置:当mid所指向的位置 > target时,right往左收;当mid所指向的位置 <= target时,left往右收。因此到最后一轮查找时,如果mid所指向的位置为target,right所指向的位置就是右端点,即最后一个位置。
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var searchRange = function(nums, target) {
    let left = 0;
    let right = nums.length - 1;
    let lres = -2;
    let rres = -2;
    while(left <= right){
        let mid = Math.floor((left + right) / 2);
        if(nums[mid] > target){
            right = mid - 1;
        }else{
            left = mid + 1;
        }
    }
    rres = right;
    left = 0;
    right = nums.length - 1;
    while(left <= right){
        let mid = Math.floor((left + right) / 2);
        if(nums[mid] < target){
            left = mid + 1;
        }else{
            right = mid - 1;
        }
    }
    lres = left;
    if(lres != -2 && rres != -2 && (rres - lres >= 1 || rres - lres == 0)){
        return [lres, rres];
    }else{
        return [-1, -1];
    }
};

74 搜索旋转排序数组

在这里插入图片描述

  • 二分查找
  • 如上图所示,经过旋转的有序数组([0, 1, 2, 4, 5, 6, 7]),可能会形成A([4, 5, 6, 7])、B([0, 1, 2])两个区域,B区域的数字均小于A区域。
  • A区域左端点设为left,B区域右端点设为right,若mid所指向的数字 = target,则返回mid;否则分为以下两种情况。
  • 当mid在A区域时:判断target是否在A区域的左半段之间([left, mid]),如果存在,则将right往左收,否则将left往右收。
  • 当mid在B区域时:判断target是否在B区域的右半段之间([mid, right]),如果存在,则将left往右收,否则将right往左收。
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    let left = 0;
    let right = nums.length - 1;
    while(left <= right){
        let mid = Math.floor((left + right) / 2);
        if(nums[mid] == target){
            return mid;
        }
        if(nums[mid] >= nums[left]){
            if(nums[left] <= target && target < nums[mid]){
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }else{
            if(nums[mid] < target && target <= nums[right]){
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
    }
    return -1;
};

75 寻找旋转排序数组中的最小值

在这里插入图片描述

  • 二分查找
  • 如上图所示,和上题相似,经过旋转的有序数组,可能会形成A、B两个区域,B区域的数字均小于A区域,因此最小值一定会出现在B区域。
  • A区域左端点设为left,B区域右端点设为right,当left和right收缩到同一段递增的区间时,找到最小值min = left所指向的数字;否则分为以下两种情况。
  • 当mid在A区域时:将left往右收。
  • 当mid在B区域时:将right往左收,此时注意:right = mid,因为mid在可能出现最小值的的B区域,所以mid所指向的数字可能就是最小值。
/**
 * @param {number[]} nums
 * @return {number}
 */
var findMin = function(nums) {
    let left = 0;
    let right = nums.length - 1;
    while(left <= right){
        let mid = Math.floor((left + right) / 2);
        if(nums[left] <= nums[mid] && nums[mid] <= nums[right]){
            return nums[left];
        }else if(nums[mid] >= nums[left]){
            left = mid + 1;
        }else if(nums[mid] <= nums[right]){
            right = mid;
        }
    }
    return -1;
};

http://www.kler.cn/news/362756.html

相关文章:

  • C++侯捷内存管理课程学习笔记汇总
  • Node.js是什么? 能做什么?
  • 动手学深度学习9.7. 序列到序列学习(seq2seq)-笔记练习(PyTorch)
  • ​​Spring6梳理17——基于XML的自动装配
  • el-table在某些条件下禁止选中
  • 【算法系列-栈与队列】匹配消除系列
  • Zabbix 监控自动化
  • 论文翻译 | A Prompt Pattern Catalog to Enhance Prompt Engineering with ChatGPT (上)
  • Qt实现自定义目录添加到导航树(导航树存在目录追加,不存在创建)
  • Scala的内部对象
  • Python基于TensorFlow实现GRU-Transformer回归模型(GRU-Transformer回归算法)项目实战
  • Java安全编程:公钥加密和私钥签名的实践指南
  • 地方门户分类信息网站源码系统 用户可以自由发帖 PHP+MySQL组合开发 带完整的安装代码包以及搭建部署教程
  • 2024前端html5,css3面试题总汇
  • 在Ubuntu上部署MQTT服务器的详细指南
  • JavaScript完整笔记
  • 列表、元组、集合、字典和 pandas 数据框(DataFrame)之间的数据转换
  • 【Qt】QTableView添加下拉框过滤条件
  • 华为无线路由器设置成交换机
  • SpringBoot项目ES6.8升级ES7.4.0
  • STM32G474使用TIM2触发DAC输出输出正弦波
  • uniapp使用webView打开的网页有缓存如何解决(APP,微信小程序)
  • HarmonyOS鸿蒙分布式文件操作的时候权限问题
  • Rust中的Sync特征:确保多线程间安全共享数据
  • 软件工程--需求分析与用例模型
  • Python包——Matplotlib