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
};
相关文章
|
3月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
2月前
|
算法 C# 索引
C#二分查找算法
C#二分查找算法
|
4月前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
4月前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
2月前
|
存储 算法 C语言
【C语言】二分查找算法
【C语言】二分查找算法
|
2月前
|
消息中间件 存储 算法
一文搞懂二分查找算法!
一文搞懂二分查找算法!
124 0
|
2月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
33 0
|
4月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
337 1
|
4月前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
80 1
|
19天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。