首页 > 其他分享 >二分查找常见变种方法的代码实现

二分查找常见变种方法的代码实现

时间:2023-07-30 17:44:59浏览次数:38  
标签:二分 upper target nums 变种 param 索引 查找

二分查找变种:

1. 查找大于target的所有值的最小索引;

2. 查找等于target的所有值的最大索引(上界);

3. 查找大于target的所有值的最大索引;

 

代码示例:

/**
 * 二分查找工具对象
 */
const BinarySearch = (function() {
    return {
        /**
         * 找出大于target的所有值中的最小索引
         * @param {number[]} nums - 有序数组
         * @param {number} target - 目标值
         */
        upper(nums, target) {
            let l = 0;
            let r = nums.length;
            // 在[l, r) 范围内查找target
            while (l < r) {
                // 中位数索引
                const m = l + Math.floor((r - l) / 2);
                // 如果m位置上的值比target小或者相等,则将左指针l移动至m + 1
                if (nums[m] <= target) {
                    l = m + 1;
                }
                // 如果当前位置上的值比target大,则移动r至m
                else {
                    r = m;
                }
            }

            return l;
        },
        /**
         * 找出等于target的值的最大索引(如果没有等于target的值,则返回大于target的值中的最小索引)
         * @param {number[]} nums - 有序数组
         * @param {number} target - 目标值
         */
        ceil(nums, target) {
            // 先找出大于target元素的最小值的索引
            const upper_idx = this.upper(nums, target);
            // 如果该索引的前一个位置上的值正好等于target,返回该值
            if (upper_idx > 0 && nums[upper_idx - 1] === target) {
                return upper_idx - 1;
            }
            // 否则返回比大于target的值中的最小索引
            return upper_idx;
        },
        /**
         * 找出小于target的所有值中的最小索引
         * @param nums 
         * @param target 
         */
        lower(nums, target) {
            let l = 0;
            let r = nums.length - 1;
            // 在[l, r)范围内搜索
            while (l < r) {
                // 相对于upper函数,这里m的取值调整为“上取整”(避免l留在原地,造成死循环 )
                const m = l + Math.ceil((r - l) / 2);
                // 当前值小于target,可能符合调整,所以将l指针调整m
                if (nums[m] < target) {
                    l = m;
                }
                // 如果大于等于target(不合符搜索目标),将r调整到m - 1
                else {
                    r = m - 1;
                }
            }

            return l;
        },
    };
})();

 

标签:二分,upper,target,nums,变种,param,索引,查找
From: https://www.cnblogs.com/fanqshun/p/17591749.html

相关文章

  • 二分
    二分答案例题abc312C-InvisibleHandqiansui_code......
  • 二分查找法
    文章目录二分查找法二分查找的关键:二分查找法演示二分查找法适用于有序数组,顺序查找绝大多数情况有效但是由于它是一个一个元素进行查找,其效率很低,只有一个for循环二分查找的关键:找到最左边元素(left)和最右边元素(right),确定中间元素(mid)intr=0; scanf("%d",&r); intarr[]={0......
  • abc312c <二分答案>
    题目C-InvisibleHand思路二分X,同时二分得到buyer和seller的人数(很精巧的二分~);当然,从复杂度角度,\(O(N\logN)\)也是可以的;实际上可以写成\(O(N)\)的形式?感觉线性扫描也可?代码点击查看代码#include<iostream>#include<algorithm>#include<vector>#include<cst......
  • 查找 SQL Server 中活动的 SQL 连接
    一、概述有多种方法可以找到SQLServer的活动SQL连接。本文分享一下几种常见的方法。二、解决方案2.1 SP_WHOSP_WHO作为查找SQLServer上运行的活动SQL连接的方法。SP_WHO将具有最少的列,但却是列出活动连接的快速方法。特别是当SQLServer上有阻塞时,可以找到阻塞和......
  • 用于查找 SQL Server 中死锁的 T-SQL 查询
    用于查找SQLServer中死锁的T-SQL查询 早些时候,我写了一篇关于使用扩展事件来查找SQLServer上发生的死锁的文章。扩展事件对于跟踪服务器上短时间内发生的死锁有很大帮助,尤其是在生产环境中。然而,在开发环境中,我遇到过当多个开发人员尝试对表执行dml语句时出现持续长......
  • 3-1 在上面有关折半查找的例子中,while 循环语句内共执行了两次测试,其实 只要一次就足
    ArchlinuxGCC13.1.1 202304292023-07-2911:07:02星期六 点击查看代码#include<stdio.h>intbinsearch(intx,intv[],intn){intlow,high,mid;low=0;high=n-1;mid=(low+high)/2;while((low<=high)&&(......
  • 散列表的查找
    散列表的查找基本思想记录的存储位置与关键字之间存在的对应关系.使用哈希函数查找对应的数据就是直接将学生的学号当做下标来存储.这样就非常好查找如何让查找根据散列函数H(key)=k查找key=n,则访问H(n)=n的地址,若内容为n则成功.若查询不到,返回一个特殊值,空指针......
  • 最长单调上升子序列(贪心+二分)
    这个的思路就是再开一个数组,存储长度为i的最长上升子序列的最后一个数字是多少,这个数组可以保证递增,之后开始二分,只要当前这个数是大于i-1的数但小于i的数,那就可以更新i的数,这里就是贪心的思想,相同长度结尾数字越小越好intlen=0;for(inti=1;i<=n;i++){intl=1,r=......
  • 【C语言】二分查找算法
    在⼀个升序的数组中查找制定的数字n,很容易想到的⽅法就是遍历数组,但是这种⽅法效率⽐较低,⽐如我买了⼀双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让你猜,你会怎么猜?你会1,2,3,4...这样猜吗?显然很慢;⼀般你都会猜中间数字,⽐如:150,然后看⼤了还是⼩了,这就是......
  • Windows | Linux 查找环境变量二进制所在目录
    1.Windows使用where命令wherejava2.Linux使用which命令whichjava......