js算法——二分查找

简介: js算法——二分查找


题目出自leetcode。


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


1你可以假设 nums 中的所有元素是不重复的。

n 将在 [1, 10000]之间。

nums 的每个元素都将在 [-9999, 9999]之间。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
};

示例


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

输出: 4

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



设置两个指针,一左一右,下标最小值0与最大值nums.length-1。

循环条件为,左指针不大于右指针,等于也要进入循环。

left+((right-left)>>1)为二分中心,值为左右指针相加除2,向下取整。

二分中心值等于目标值时返回下标,当小于目标值时移动左指针到二分中心 +1,大于目标值时移动右指针到二分中心 -1。

跳出循环仍未返回表示无目标值返回-1。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
  let left=0
  let right=nums.length-1
  while(right>=left){
    let index=left+((right-left)>>1)
    if(nums[index]===target){
        return index
    }else if(nums[index]<target){
        left=index+1
    }else{
        right=index-1
    }
  }
  return -1
};

变形题


若存在重复值且要返回的下标尽可能小?

  1. 当找到目标时不能确定该目标值是所有目标值中下标最小的,因此先储存当前下标,若找到更小的进行替换。
  2. 如何找到下标更小的目标值?继续往左侧查找,最后一次储存的下标值最小。
  3. 等跳出循环后时,最后一次储存的下标值就是尽可能小的。
var search = function(nums, target) {
  let left=0
  let right=nums.length-1
  let res=-1
  while(right>=left){
    let index=parseInt((right+left)/2)
    if(nums[index]===target){
        res=index
        right=index-1
    }else if(nums[index]<target){
        left=index+1
    }else{
        right=index-1
    }
  }
  return res
};

若需要在升序列表中找到一个位置插入?

  1. 用二分查到该插入的位置(若有重复就是对应的查找值位置,若无重复值找到遍历结束的左侧left值位置)。
  2. splice插入。
var inset = function(nums, target) {
   const searchIndex=(val)=>{
     let left=0,right=nums.length-1
     while(left<=right){
        let cen=left+((right-left)>>1)
        if(val===nums[cen]){
           return cen
        }else if(val<nums[cen]){
           right=cen-1
        }else{
           left=cen+1
        }
     }
     return left
   }
   const add=(val)=>{
     const index=searchIndex(val)
     nums.splice(index,0,val)
   }
   return nums
};
相关文章
|
2月前
|
存储 监控 算法
局域网监控其他电脑的设备信息管理 Node.js 跳表算法
跳表通过分层索引实现O(logn)的高效查询、插入与删除,适配局域网监控中设备动态接入、IP映射及范围筛选等需求,相比传统结构更高效稳定,适用于Node.js环境下的实时设备管理。
116 9
|
4月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
198 0
|
2月前
|
存储 监控 JavaScript
企业上网监控系统的恶意 URL 过滤 Node.js 布隆过滤器算法
布隆过滤器以低内存、高效率特性,解决企业上网监控系统对百万级恶意URL实时检测与动态更新的难题,通过概率性判断实现毫秒级过滤,内存占用降低96%,适配大规模场景需求。
232 3
|
2月前
|
存储 监控 算法
电脑管控软件的进程优先级调度:Node.js 红黑树算法
红黑树凭借O(log n)高效插入、删除与查询特性,适配电脑管控软件对进程优先级动态调度的高并发需求。其自平衡机制保障系统稳定,低内存占用满足轻量化部署,显著优于传统数组或链表方案,是实现关键进程资源优先分配的理想选择。
145 1
|
3月前
|
存储 算法 搜索推荐
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
专攻软考高频算法,深度解析二分查找、堆排序、快速排序核心技巧,对比九大排序算法,配套动画与真题,7天掌握45%分值模块。
171 1
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
|
3月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
236 3
|
7月前
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
191 4
|
7月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
186 3
|
算法 JavaScript 前端开发
JavaScript算法和数据结构:写一个二分查找的函数。
JavaScript算法和数据结构:写一个二分查找的函数。
118 0
|
消息中间件 算法 JavaScript
JavaScript算法和数据结构:描述一下栈和队列的特点及应用场景。
JavaScript算法和数据结构:描述一下栈和队列的特点及应用场景。
229 0

热门文章

最新文章