二分查找,查找第一个大于目标元素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

相关文章

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

mybatis的mapper对应的xml写法及配置详解

《mybatis的mapper对应的xml写法及配置详解》这篇文章给大家介绍mybatis的mapper对应的xml写法及配置详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录前置mapper 对应 XML 基础配置mapper 对应 xml 复杂配置Mapper 中的相

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

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

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