二分查找,查找第一个大于目标元素target所对应的下标-2300. 咒语和药水的成功对数

题目链接及描述

2300. 咒语和药水的成功对数 - 力扣(LeetCode)

题目分析

        这道题目作为一个典型的二分查找,题目中所述,找到每一个spells[i]在positions中对应的元素positions[i]使其乘积大于给定元素sucess,并统计每一个spell[i]所对应的positions中所查找元素的个数,并将其返回。

        本题本质思想并不难:

  • 对positions数组进行升序排序。【便于二分查找】
  • 遍历spells数组,对于每一个spells[i]根据success的值利用除法找到另一个因子num。由于Java中的触发是向下取整的,所以这里需要根据余数是否为0来判断最终因子num是否需要+1操作,否则向下取整算出来的success小于给定success。

    ​​​​​​​long num = ((success % (long)spells[i]) == 0) ? (success / (long)spells[i]) : (success / (long)spells[i] + 1);

  • 根据positions数组和num,查找第一个大于等于num的值对应的下标i,并返回i。
  • 根据返回的i和positions数组的长度给每一个ans[i]赋值。

        难点分析一:需要将计算出来的num设置为long类型,若设置为int,则强转为int会出现出现精度丢失,通过不了全部测试用例。

        难点分析二:如何根据给定数组positions,查找第一个大于等于目标值target所对应的下标:

  1. 给定数组positions中存在大于等于目标值target的元素,则直接返回第一个大于等于目标值target对应的下标。
  2. 给定数组positions中不存在大于等于目标值target的元素,此时返回数组长度len,也就是不存在。

        根据以上分析可以定义左边界L=0,右边界R = positions.length。并定义循环while(L < R)。

public int getFirstNum(int[] potions, long target){int L = 0, R = potions.length;while(L < R){int midIdx = (L + R) / 2;long mid = (long)potions[midIdx];if(mid >= target){R = midIdx;}else{L = midIdx + 1;}}return R; 
}

        关于上面的右边界的定义为什么不将R定义为R = positions.lenth - 1,如果这样定义,由于返回值为L == R,此时对于数组positions中不存在对应目标元素target的情况仍然返回下标len - 1,无法判断数组中存不存在第一个大于等于目标元素traget对应的元素。 

        引申扩展:如何找到数组positions中第一个小于等于目标元素target对应的下标?

    public int getFirstNum(int[] potions, long target){int L = -1, R = potions.length - 1;while(L < R){int midIdx = (L + R) / 2;long mid = (long)potions[midIdx];if(mid > target){R = midIdx - 1;}else if(mid <= target){L = midIdx;}}return R; }

代码编写

class Solution {public int[] successfulPairs(int[] spells, int[] potions, long success) {Arrays.sort(potions);int n = spells.length;int[] ans = new int[n];for(int i = 0; i < n; i++){long num = ((success % (long)spells[i]) == 0) ? (success / (long)spells[i]) : (success / (long)spells[i] + 1);int res = getFirstNum(potions, num);if(res >= 0 && res < potions.length){ans[i] = potions.length - res;}}return ans;}public int getFirstNum(int[] potions, long target){int L = 0, R = potions.length;while(L < R){int midIdx = (L + R) / 2;long mid = (long)potions[midIdx];if(mid >= target){R = midIdx;}else{L = midIdx + 1;}}return R; }
}

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

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

相关文章

云队友:专业的远程工作和程序员接单平台,用户体验佳

编程赚钱的平台有不少&#xff0c;良莠不齐&#xff0c;今天给大家分享个专业的远程工作平台&#xff0c;以技术类工作为主&#xff08;包括编程&#xff09;&#xff1a; 云队友简介 外包大师是PMCAFF互联网产品社区于2016年推出的互联网产品技术外包服务平台。外包大师最新…

MySQL学习——行数计算

数据库经常被用来回答这样的问题&#xff1a;“某种类型的数据在表中出现的频率是多少&#xff1f;”例如&#xff0c;你可能想知道你有多少只宠物&#xff0c;或者每个主人有多少只宠物&#xff0c;或者你可能想对你的动物进行各种类型的人口普查操作。 计算你拥有的动物总数…

HCIP的学习(28)

第九章&#xff0c;链路聚合和VRRP 链路聚合 ​ 目的&#xff1a;备份链路以及提高链路带宽。 ​ 链路聚合技术&#xff08;Eth-Trunk&#xff09;&#xff1a;将多个物理接口捆绑成一个逻辑接口&#xff0c;将N条物理链路逻辑上聚合为一条逻辑链路。 正常情况下&#xff0c;…

成功解决“IndexError: queue index out of range”错误的全面指南

成功解决“IndexError: queue index out of range”错误的全面指南 引言 在Python编程中&#xff0c;queue模块提供了同步队列类&#xff0c;包括FIFO&#xff08;先进先出&#xff09;队列Queue&#xff0c;LIFO&#xff08;后进先出&#xff09;队列LifoQueue&#xff0c;以…

Redis——基本命令

概念&#xff1a; Redis(REmote Dlctionary Server) 是用 C语言开发的一个开源的高性能键值对(key-value) 数据库 特征&#xff1a; 1. 数据间没有必然的关联关系 2. 内部采用单线程机制进行工作 3. 高性能 4. 多数据类型支持 字符串类型 string 列表类型 …

零基础入门篇①⑥ Python可变序列类型--字典

Python从入门到精通系列专栏面向零基础以及需要进阶的读者倾心打造,9.9元订阅即可享受付费专栏权益,一个专栏带你吃透Python,专栏分为零基础入门篇、模块篇、网络爬虫篇、Web开发篇、办公自动化篇、数据分析篇…学习不断,持续更新,火热订阅中🔥专栏限时一个月(5.8~6.8)重…

C++STL---deque常见用法

C STL中的deque deque&#xff08;双端队列&#xff09;是C标准模板库&#xff08;STL&#xff09;中的一个序列容器&#xff0c;它允许在容器的前端和后端快速插入和删除元素。与vector相比&#xff0c;deque提供了更灵活的数据结构&#xff0c;特别适合于需要频繁在两端操作…

期权高频交易能做吗?期权可以频繁交易吗?

今天带你了解期权高频交易能做吗&#xff1f;期权可以频繁交易吗&#xff1f;在期权交易市场&#xff0c;大部分人都知道不能频繁交易&#xff0c;就连不少投资新手都知道频繁交易是大忌&#xff0c;是错误的&#xff0c;是应该避免的。所以是不行的。 期权高频交易能做吗&…

智慧公安大数据研判工具(十八)

智慧公安以大数据、云计算、人工智能、物联网和移动互联网技术为支撑&#xff0c;以“打、防、管、控”为目的&#xff0c;综合研判为核心&#xff0c;共享信息数据资源&#xff0c;融合业务功能&#xff0c;构建公安智慧大数据平台&#xff0c;实现公安信息数字化、网络化和智…

阿里云搭建物联网平台+MQTT.fx接入阿里云

文章目录 本篇介绍一、阿里云物联网平台搭建二 、MQTT客户端接入阿里云物联网平台总结 本篇介绍 本篇搭建了阿里云物联网平台&#xff0c;使用MQTT.fx接入阿里云&#xff0c;上传温湿度数据 使用到的软件&#xff1a;阿里云、MQTT.fx 一、阿里云物联网平台搭建 首先创建一个物…

MinIO 使用

MinIO自建对象存储 1、dock-compose 使用dock-compose拉取 minio:image: "minio/minio"container_name: minioports:- "9000:9000"- "9001:9001"volumes:- "./minio/data1:/data1"- "./minio/data2:/data2"restart: on-fai…

go语言方法之方法值和方法表达式

我们经常选择一个方法&#xff0c;并且在同一个表达式里执行&#xff0c;比如常见的p.Distance()形式&#xff0c;实际上 将其分成两步来执行也是可能的。p.Distance叫作“选择器”&#xff0c;选择器会返回一个方法"值"->一 个将方法(Point.Distance)绑定到特定接…

从 AdaBoost 到随机森林:深入解析集成学习方法【集成学习】

集成学习的思想 集成学习是一种通过组合多个基学习器&#xff08;弱学习器&#xff09;来提高模型预测性能的机器学习方法。集成学习的思想类似于谚语“三个臭皮匠&#xff0c;顶个诸葛亮”&#xff0c;即通过集成多个表现较差的学习器&#xff0c;可以获得一个强大的整体模型…

从0开发一个Chrome插件:测试项目效果

前言 这是《从0开发一个Chrome插件》系列的第五篇文章,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。 专栏: 从0开发一个Chrome插件:什么是Chrome插件?从0开发一个Chrome插件:开发Chrome插件的必要…

Glow模型【图解版加代码】

论文&#xff1a;Glow: Generative Flow with Invertible 1x1 Convolutions 代码&#xff1a;pytorch版本&#xff1a;rosinality/glow-pytorch: PyTorch implementation of Glow (github.com) 正版是TensorFlow版本 openai的 参考csdn文章&#xff1a;Glow-pytorch复现gith…

Cobalt_Strike(CS)渗透工具安装使用到免杀上线

Cobalt_Strike&#xff08;CS&#xff09;安装到免杀上线 原文链接&#xff1a; cs免杀上线 点我 https://mp.weixin.qq.com/s?__bizMzkxNDY5NzMxNw&amp;mid2247483862&amp;idx1&amp;snc6b4da3ce5772a075431098227397baa&amp;chksmc16b3cdcf61cb5ca06f61513…

以sqlilabs靶场为例,讲解SQL注入攻击原理【18-24关】

【less-18】 打开时&#xff0c;获取了自己的IP地址。&#xff0c;通过分析源码知道&#xff0c;会将用户的user-agent作为参数记录到数据库中。 提交的是信息有user-Agent、IP、uname信息。 此时可以借助Burp Suite 工具&#xff0c;修改user_agent&#xff0c;实现sql注入。…

力扣14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"示例 2&#xff1a; 输…

数字水印 | 盲水印嵌入:量化索引机制 QIM

目录 1 什么是量化索引调制&#xff1f;1.1 为什么使用 QIM&#xff1f;1.2 QIM 的算法思想1.3 什么是量化操作&#xff1f;1.4 论文中对 QIM 的介绍 2 盲水印论文中的实际应用2.1 均匀量化器2.2 对论文的分析 &#x1f607;前言&#xff1a;不知道为什么&#xff0c;Q…

Windows下如何把Oracle从C盘整体迁移到D盘?

&#xff08;一&#xff09;写这篇文章的起因 这篇文章适合刚接触的技术小白follow操作&#xff0c;整理文章不易&#xff0c;大家多多点赞转发 起因是昨天有会员在群里发问&#xff0c;客户要把Oracle整个目录从C盘挪到D盘怎么弄 客户那边的人把Oracle整个程序数据文件都安装…