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

本文主要是介绍二分查找,查找第一个大于目标元素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; }
}

这篇关于二分查找,查找第一个大于目标元素target所对应的下标-2300. 咒语和药水的成功对数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1024948

相关文章

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

pytorch+torchvision+python版本对应及环境安装

《pytorch+torchvision+python版本对应及环境安装》本文主要介绍了pytorch+torchvision+python版本对应及环境安装,安装过程中需要注意Numpy版本的降级,... 目录一、版本对应二、安装命令(pip)1. 版本2. 安装全过程3. 命令相关解释参考文章一、版本对

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python重命名文件并移动到对应文件夹

《Python重命名文件并移动到对应文件夹》在日常的文件管理和处理过程中,我们可能会遇到需要将文件整理到不同文件夹中的需求,下面我们就来看看如何使用Python实现重命名文件并移动到对应文件夹吧... 目录检查并删除空文件夹1. 基本需求2. 实现代码解析3. 代码解释4. 代码执行结果5. 总结方法补充在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje