前端高频面试算法题之二分查找

这道二分查找是一道比较基础的题目,一些中小厂在面试无经验或低年限经验的同学的时候考察的概率比较大。

题目描述

LeetCode 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1, 0, 3, 5, 9, 12], target = 9

输出: 4

解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1, 0, 3, 5, 9, 12], target = 2

输出: -1

解释: 2 不存在 nums 中因此返回 -1

tip 提示:

  • 你可以假设 nums 中的所有元素是不重复的。
  • n 将在 [1, 10000]之间。
  • nums 的每个元素都将在 [-9999, 9999]之间。

解题思路

题目已经说明了数组有序,因此可以使用二分查找,时间复杂度 O(logn)
步骤:

  • 定义左右指针 left 和 right,初始值分别指向 0 和 n-1 位置

  • while 循环判断,当左指针小于等于右指针时,执行循环体

    • 定义中间指针 mid,值为 left+Math.floor((right-left) / 2)
    • 如果中间指针指向的元素等于目标值,返回中间指针
    • 如果中间指针指向的元素大于目标值,将右指针指向mid - 1
    • 如果中间指针指向的元素小于目标值,将左指针指向mid + 1
  • 循环结束后,返回 -1,表示没找到

IMPORTANT

mid - 1mid + 1非常重要,不能直接使用mid,因为要保证每次循环搜索范围都在减小,不然如果数组中只剩一个元素容易陷入无限循环。

代码

/*** @param {number[]} nums* @param {number} target* @return {number}*/
const search = function (nums, target) {let left =0;//初始化左指针let right =nums.length-1//初始化右指针// 左指针在右指针左边才执行循环体while(left<=right){// 找中间位置,用下面这种写法而不用Math.floor((right+left)/2)是为了防止 right+left超过数字表示上限let mid=left + Math.floor((right-left)/2)// 解题思路和注意事项中有if(nums[mid]===target){return mid}else if(nums[mid]>target){right=mid-1}else{left=mid+1}}// 没找到返回 -1return -1
};

关于 Math 的知识点拓展

MDN Math
Math 是一个内置对象,它拥有一些数学常数属性和数学函数方法。Math 不是一个函数对象。

Math 不是一个构造器。Math 的所有属性与方法都是静态的。例如:引用圆周率的写法是 Math.PI

Math 常用方法和静态属性

  • Math.ceil() 静态方法总是向上舍入,并返回大于等于给定数字的最小整数。
  • Math.floor() 函数总是返回小于等于一个给定数字的最大整数。
  • Math.max() 函数返回作为输入参数的最大数字,如果没有参数,则返回 -Infinity。
  • Math.min() 函数返回作为输入参数的数字中最小的一个,如果没有参数,则返回 Infinity。
  • Math.random() 静态方法返回一个大于等于 0 且小于 1 的伪随机浮点数,并在该范围内近似均匀分布,然后你可以缩放到所需的范围
  • Math.round() 函数返回一个数字四舍五入后最接近的整数
  • Math.PI 表示一个圆的周长与直径的比例,约为 3.14159,只可读,不可写,不可枚举,不可配置

代码示例

Math.ceil(4); //4
Math.ceil(0.95); //1
Math.ceil(7.004); //8
Math.ceil(-7.004); //-7Math.floor(5.95); //5
Math.floor(-5.05); //-6Math.max(-1, -3, -2); //-1const array1 = [1, 3, 2];
Math.max(...array1); //3Math.min(-2, -3, -1); //-3
Math.min(...array1); //1x = Math.round(20.49); //20
x = Math.round(-20.5); //-20function calculateCircumference(radius) {return 2 * Math.PI * radius;
}
calculateCircumference(1); // 6.283185307179586

总结

这道二分查找是一道比较基础的题目,值得注意的地方就是:1、双指针思路,2、中间值的求法,3、left 和 right 两个指针每次经过一次循环要利用mid + 或者 - 1进行必须的区间缩小处理。最后复习了JavaScript中内置Math对象的常用静态方法和属性。

有收货的话可以点个赞哟,更多算法提持续更新中,点波关注不迷路,下一期会更新一道中等难度的算法题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ProbTS:时间序列预测的统一评测框架

编者按&#xff1a;如今&#xff0c;时间序列预测在健康、能源、商业、气候等多个行业发挥着至关重要的作用。它不仅影响着相关资源的分配和调度&#xff0c;还影响着行业的管理和运营决策。但是现有的时间序列预测方法通常缺乏对基础预测需求的全面考虑&#xff0c;无论是经典…

JavaScript青少年简明教程:开发工具与运行环境

JavaScript青少年简明教程&#xff1a;开发工具与运行环境 JavaScript是一种基于对象和事件驱动且具有安全性能的脚本语言。使用它和HTML结合可以开发出交互式的Web页面。 脚本语言是为了缩短传统的编写-编译-链接-运行过程而创建的计算机编程语言。脚本通常是解释执行而非编…

阿里巴巴矢量图标库使用

阿里巴巴矢量图标库官网 添加图标到购物车 悬浮到图标上面会有个购物车icon,点击一下就可以添加购物车了 添加图标到项目 添加完购物车后,右上角会有当前在购物车的数量,点击右上角购物车icon,在新弹窗内点击添加至项目,选择添加到哪个项目(没有项目就创建一个),点击完成,…

Milvus 核心设计(1) ---- 数据一致性的等级及使用场景

目录 背景 Milvus的数据一致性 设置数据一致性等级 等级类型 PACELC定理 level 详细解释 Strong Bounded staleness Session Eventually 总结 背景 分布式上的可扩展性是个比较重要的concept。Chroma 核心之前写过了,他的最大优势在于轻量级且好用。Milvus相对Ch…

初识Spring Web MVC

1. 什么是 Spring Web MVC&#xff1f; Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为"SpringMVC".Servlet&am…

省市县下拉框的逻辑以及多表联查的实例

2024.7.12 一. 省市县的逻辑开发。1、准备&#xff1a;1.1. 要求&#xff1a;1.2 数据库表&#xff1a; 2. 逻辑&#xff1a;3. 方法3.1 创建实体类3.2 数据访问层3.3 实现递归方法3.4 控制器实现3.5 前端处理 二、多表联查&#xff08;给我干红温了&#xff09;1. 出现了问题2…

Mac VSCode 突然闪退、崩溃、打不开了

vscode 1.90.2版本下载&#xff0c;刚上传还在审核中 1、 思路历程 VSCode 作为前端常用开发工具&#xff0c;其重要性就不一一描述了。 所以 VSCode 突然打不开了&#xff0c;真的是让我一脸懵逼。 本来以为问题不大&#xff0c;于是 &#xff1a; 1、重启了一下VSCode 2、…

2024最新最全面的软件测试自动化面试题(含答案)

1.如何把自动化测试在公司中实施并推广起来的&#xff1f; 选择长期的有稳定模块的项目 项目组调研选择自动化工具并开会演示demo案例&#xff0c;我们主要是演示selenium和robot framework两种。 搭建自动化测试框架&#xff0c;在项目中逐步开展自动化。 把该项目的自动化…

【C语言】实践:贪吃蛇小游戏(附源码)

欢迎光顾我的homepage 前言 贪吃蛇小游戏想必大家都玩过吧&#xff0c;现在就要C语言代码来实现一下贪吃蛇小游戏 在实现之前&#xff0c;我们要对C语言结构体、指针、链表(单链表)有一定的基础 先来看一下预期运行效果 一、Win32 API 这里实现贪吃蛇游戏会使用一些Win32 AP…

论文阅读【时间序列】TimeMixer (ICLR2024)

【时间序列】TimeMixer (ICLR2024) 原文链接&#xff1a;TIMEMIXER: DECOMPOSABLE MULTISCALE MIXING FOR TIME SERIES FORECASTING 代码仓库&#xff1a;https://github.com/kwuking/TimeMixer 符号定义 符号含义P用于预测的历史序列长度&#xff08;seq_len&#xff09;F预测…

权力之望账号怎么注册 权力之望注册游戏账号教程

不会吧不会吧&#xff0c;这款新的MMORPG游戏&#xff0c;权力之望&#xff0c;马上就要上线啦。支援PC 及行动装置跨平台游玩的MMORPG《权力之望》以Unity 引擎研发&#xff0c;利用动态捕捉、3D 扫描技术呈现细腻的游戏画面。本作主打高自由度的武器选择成长与后续的战斗类型…

力扣8,字符串转换整数

题目&#xff1a; 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数。 函数 myAtoi(string s) 的算法如下&#xff1a; 空格&#xff1a;读入字符串并丢弃无用的前导空格&#xff08;" "&#xff09; 符号&#xff1a;检…

分割——半自动打标签工具ISAT详细安装及使用教程

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

git总是鉴权失败的解决办法

git clone或者git cherry-pick总是报"错鉴权失败"&#xff08;用户名和密码没问题&#xff09; remote: Unauthorized fatal: https://code.gerrit.com/a/project_name/ 鉴权失败 最后确认问题&#xff1a; 该密码并不是gerrit的登录密码&#xff0c;而是“Settings…

C语言中的数组:掌握数据的有序集合【一维数组,二维数组,字符串数组,直方图打印,计算全排列,字符数组常用函数】

目录 C语言中的数组&#xff1a;掌握数据的有序集合【一维数组&#xff0c;二维数组&#xff0c;字符串数组】一维数组一维数组的创建数组的七种初始化完全初始化&#xff1a;部分初始化&#xff1a;字符数组的初始化&#xff1a;自动初始化为0&#xff1a;使用memset函数初始化…

[C++]初识C++(命名空间,命名空间使用,函数重载,缺省参数等)

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到C探索系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭建个人网站…

c++之类和对象上

目录 1. 类的定义 2. 访问限定符 3. 类域 4. 实例化 5. 对象的大小 6. 为什么要内存对齐 7. this指针 1. 类的定义 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后⾯分号不能省 略。类体中内容称为类的…

(篇一)走进FreeRtos—认识FreeRtos

【温故知新篇】 【在现在的工作中一直在使用FreeRtos&#xff0c;但是对它的了解还是不够深入&#xff0c;现在由浅入深&#xff0c;分模块学习和记录&#xff0c;最后将自己基于FreeRtos开发项目实践】 首先我们将这个系统当作一座庄园&#xff0c;开始第一步走进庄园&#…

【备战秋招】——算法题目训练和总结day4

【备战秋招】——算法题目训练和总结day4&#x1f60e; 前言&#x1f64c;Fibonacci数列我的题解思路分享代码分享 单词搜索我的题解思路分享代码分享 杨辉三角我的题解思路分享代码分享 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢…

迎接AI新时代:GPT-5的技术飞跃与未来展望

引言 随着人工智能技术的迅猛发展&#xff0c;大语言模型在过去几年取得了显著进步。OpenAI最新的声明表明&#xff0c;GPT-5将在一年半后发布&#xff0c;并将带来从高中生智力水平到博士生智力水平的飞跃。这一突破引起了科技界和公众的广泛关注。本文将从技术突破预测、智能…