【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;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/892322.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

容器实战高手课---09 Page Cache:为什么我的容器内存使用量总是在临界点

你好&#xff0c;我是程远。 上一讲&#xff0c;我们讲了Memory Cgroup是如何控制一个容器的内存的。我们已经知道了&#xff0c;如果容器使用的物理内存超过了Memory Cgroup里的memory.limit_in_bytes值&#xff0c;那么容器中的进程会被OOM Killer杀死。 不过在一些容器的使…

MybatisPlus分页Page插件

分页Page插件 首先&#xff0c;要在配置类中注册MyBatisPlus的核心插件&#xff0c;同时添加分页插件。设置分页查询的配置类,interceptor只有拦截作用&#xff0c;功能需要自己添加。这里我们添加上分页查询功能。 import com.baomidou.mybatisplus.annotation.DbType; impo…

Java中的数组

一、数组的创建及初始化 1、创建数组 int 表示数组中元素类型 int[] 表示数组的类型 array 表示数组名 2、数组初始化 数组初始化可分为动态初始化和静态初始化&#xff0c;动态初始化只初始化数组的大小&#xff0c;而静态初始化是直接给出数组中的具体元素 动态初始化&am…

dlib库实现人脸检测

摘要 本文将向您介绍如何使用dlib库在图片以及视频中实现人脸识别检测。通过简单的Python代码&#xff0c;我们将展示如何定位图片中的人脸并绘制边框。 引言 人脸识别技术在当今世界越来越普及&#xff0c;应用场景广泛&#xff0c;如安全监控、身份认证、图像处理等。dlib…

OpenCV高级图形用户界面(11)检查是否有键盘事件发生而不阻塞当前线程函数pollKey()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 轮询已按下的键。 函数 pollKey 无等待地轮询键盘事件。它返回已按下的键的代码或如果没有键自上次调用以来被按下则返回 -1。若要等待按键被按…

考研C语言程序设计_语法相关(持续更新)

目录 一、语法题strlen转义字符内置数据类型字符串结束标志局部变量和全局变量名字冲突 局部优先switch语句中的关键字数组初始化是否正确注意define不是关键字C语言中不能用连等判断switch( )的括号里可以是什么类型?关于if关于switch关于while 二、程序阅读题有关static有关…

【重学 MySQL】六十九、揭秘级联约束,让你的数据库关系更智能、更强大!

【重学 MySQL】六十九、揭秘级联约束&#xff0c;让你的数据库关系更智能、更强大&#xff01; 级联约束的定义级联约束的类型级联约束的应用场景级联约束的实现方式级联约束的注意事项 在MySQL数据库中&#xff0c;级联约束是维护数据完整性和一致性的重要机制。它允许在执行某…

Spring源码分析:bean加载流程

背景 在Spring中&#xff0c;Bean的加载和管理是其核心功能之一&#xff0c;包括配置元数据解析、Bean定义注册、实例化、属性填充、初始化、后置处理器处理、完成创建和销毁等步骤。 源码入口 AbstractBeanFactory#doGetBean 具体源码流程如下&#xff1a; bean加载流程&#…

万界星空科技:智能称重打标系统

万界星空科技的称重系统是其为制造业&#xff0c;特别是线缆、漆包线、食品等行业提供的重要解决方案之一。以下是对该系统的详细介绍&#xff1a; 一、系统概述 万界星空科技称重系统是集成在其MES&#xff08;制造执行系统&#xff09;中的一个功能模块&#xff0c;专门用于…

数据结构之旅(顺序表)

前言: Hello,各位小伙伴们我们在过去的60天里学完了C语言基本语法,由于小编在准备数学竞赛,最近没有给大家更新,并且没有及时回复大家的私信,小编在这里和大家说一声对不起!,小编这几天会及时给大家更新初阶数据结构的内容,然后我们来学习今天的内容吧! 一. 顺序表的概念和结…

2024.10.15 sql

刷题网站&#xff1a; 牛客网 select device_id as user_infos_example from user_profile where id < 2 select device_id, university from user_profile where university"北京大学" select device_id, gender, age, university from user_profile where ag…

Bellman-Ford

思路 外层遍历V-1次内层遍历所有边&#xff08;共E次&#xff09;&#xff0c;尝试更新起点的终点的dist值 原材料是backup&#xff08;前次遍历的结果&#xff09;维持住性质&#xff08;见下&#xff09; 优点 允许负环 允许负权边 有特殊性质 缺点 复杂度达到 例题 代码…

2、CSS笔记

文章目录 二、CSS基础CSS简介CSS语法规范CSS代码风格CSS选择器CSS基础选择器标签选择器类选择器--最常用id选择器通配符选择器 CSS复合选择器交集选择器--重要并集选择器--重要后代选择器--最常用子代选择器--重要兄弟选择器相邻兄弟选择器通用兄弟选择器 属性选择器伪类选择器…

Flutter url_launcher:打开网页、邮件、电话和短信的最佳实践

Flutter url_launcher&#xff1a;打开网页、邮件、电话和短信的最佳实践 视频 https://youtu.be/uGT43gZNkyc https://www.bilibili.com/video/BV1G42EYcE7K/ 前言 原文 如何在 Flutter 中使用 url_launcher 打开网页和发送短信 本文介绍了如何在 Flutter 中使用 url_launc…

【深度学习代码调试1】环境配置篇(上) -- 安装PyTorch(安利方法:移除所有国内源,使用默认源)

【深度学习代码调试1】环境配置篇 -- 安装TensorFlow和PyTorch 写在最前面1. 创建新的Conda环境2. 安装PyTorch及相关库&#xff08;可以直接跳到2.3安装方法&#xff09;2.1 检查CUDA版本2.2 解决安装过程中常见问题2.2.1 超时问题&#xff08;这个不是最终解决方案&#xff0…

【argparse】 菜鸟实用教程指南

文章目录 0. 引言1. argparse简介2. argparse的使用3. 实例操作4. 代码运行4.1 命令行执行4.1 IDE执行 5. 总结 0. 引言 在深度学习的过程中&#xff0c;我们常常需要操作和调参大量的参数。如果采用硬编码&#xff08;直接在代码中赋值&#xff09;的方式来设置这些参数&…

java项目之科研工作量管理系统的设计与实现源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的科研工作量管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 科研工作…

【C语言】算术运算、关系运算、逻辑运算

算术运算&#xff1a;常见的数字运算&#xff0c;加减乘除等 关系运算&#xff1a;数值之间大小多少的关系 逻辑运算&#xff1a;逻辑与、或、非 #include <stdio.h> /* 功能&#xff1a;算术运算、关系运算、逻辑运算 时间&#xff1a;2024年10月 地点&#xff1a;贤者…

斯坦福 CS229 I 机器学习 I 构建大型语言模型 (LLMs)

1. Pretraining -> GPT3 1.1. Task & loss 1.1.1. 训练 LLMs 时的关键点 对于 LLMs 的训练来说&#xff0c;Architecture&#xff08;架构&#xff09;、Training algorithm/loss&#xff08;训练算法/损失函数&#xff09;、Data&#xff08;数据&#xff09;、Evalu…

Linux INPUT 子系统实验

按键、鼠标、键盘、触摸屏等都属于输入(input)设备&#xff0c;Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备&#xff0c;只是在此基础上套上了 input 框架&#xff0c;用户只需要负责上报输入事件&#xff0c;比如按键值、坐…