当前位置: 首页 > news >正文

LeetCode算法题(Go语言实现)_54

题目

给你两个正整数数组 spells 和 potions ,长度分别为 n 和 m ,其中 spells[i] 表示第 i 个咒语的能量强度,potions[j] 表示第 j 瓶药水的能量强度。
同时给你一个整数 success 。一个咒语和药水的能量强度 相乘 如果 大于等于 success ,那么它们视为一对 成功 的组合。
请你返回一个长度为 n 的整数数组 pairs,其中 pairs[i] 是能跟第 i 个咒语成功组合的 药水 数目。

一、代码实现(Go语言实现)

import ("sort"
)func successfulPairs(spells []int, potions []int, success int64) []int {sort.Ints(potions)m := len(potions)res := make([]int, len(spells))for i, s := range spells {if s == 0 {res[i] = 0continue}s64 := int64(s)minPotion := (success + s64 - 1) / s64idx := sort.Search(m, func(j int) bool {return int64(potions[j]) >= minPotion})res[i] = m - idx}return res
}

二、算法分析

1. 核心思路
  • 排序与二分查找:通过将药水数组排序,对每个咒语使用二分查找快速确定满足条件的最小药水位置。
  • 数学优化:利用整数运算避免浮点计算,准确计算每个咒语所需药水的最小值。
2. 关键步骤
  1. 预处理药水数组:对药水数组进行排序以便后续二分查找。
  2. 遍历咒语数组:对每个咒语计算所需药水的最小值。
  3. 二分查找确定位置:使用二分查找确定第一个满足条件的药水位置,从而计算出满足条件的药水数量。
3. 复杂度
指标说明
时间复杂度O(m log m + n log m)排序药水数组耗时 O(m log m),每个咒语二分查找耗时 O(log m)
空间复杂度O(m)存储排序后的药水数组

三、图解示例

在这里插入图片描述

四、边界条件与扩展

1. 特殊场景验证
  • 咒语强度极大:当咒语强度极大时,所需药水值极小,可能全部满足。
  • 药水全不满足:当药水最大值仍小于最小需求时,结果为0。
  • 成功值为0:根据题意成功值始终为正,无需处理。
2. 扩展应用
  • 多维匹配:扩展到多维属性匹配问题(如多条件组合)。
  • 动态药水更新:支持动态添加/删除药水并实时查询。
  • 分布式处理:大规模数据时采用分布式排序与查询。
3. 多语言实现
import bisectdef successfulPairs(spells, potions, success):potions.sort()m = len(potions)return [m - bisect.bisect_left(potions, (success + s - 1) // s) for s in spells]
import java.util.Arrays;public class Solution {public int[] successfulPairs(int[] spells, int[] potions, long success) {Arrays.sort(potions);int[] res = new int[spells.length];for (int i = 0; i < spells.length; i++) {int s = spells[i];long minPotion = (success + s - 1) / s;int idx = Arrays.binarySearch(potions, (int) minPotion);if (idx < 0) idx = -idx - 1;res[i] = potions.length - idx;}return res;}
}

五、总结与优化

1. 算法对比
方法优势适用场景
二分查找时间效率高静态数据查询
线性扫描无需预处理小规模数据
哈希预处理快速查询频繁重复查询
2. 工程优化
  • 预处理缓存:对药水数组预排序并缓存结果。
  • 并行处理:多线程处理不同咒语的查询。
  • 内存优化:对排序后的药水数组进行压缩存储。
3. 扩展方向
  • 动态阈值调整:支持动态变化的成功阈值。
  • 多条件组合:结合多个条件(如药水类型、等级)进行匹配。
  • 实时反馈系统:集成到实时游戏系统中进行高效匹配计算。

相关文章:

  • java/python——两个行为(操作)满足原子性的实现
  • Web前端:Overflow属性(超出裁剪属性)
  • vllm+vllm-ascend本地部署QwQ-32B
  • MYSQL之基础认识(卸载安装登录, 基本概念)
  • Linux论坛安装
  • 【第四章】19-匹配规则定义
  • JavaScript实现二级菜单
  • 【uniapp-兼容性处理】安卓uView组件中u-input后置插槽不展示
  • Vmware esxi 给现有磁盘增加空间后并扩展系统里磁盘空间
  • Redis 键管理
  • AI Agent认知框架(ReAct、函数调用、计划与执行、自问自答、批判修正、思维链、思维树详解和对比,最后表格整理总结
  • redis-7 安装
  • linux sysfs使用cat无显示的原因:返回值未赋值
  • 《深入解析C++中的explicit关键字:防止隐式转换的利器》
  • C语言main的参数;argc与argv
  • 开源键鼠共享软件的“爱恨情仇“:Deskflow、InputLeap与Barrier的演化史
  • Shell脚本-四则运算符号
  • spark基础介绍
  • Neowise Labs Contest 1 (Codeforces Round 1018, Div. 1 + Div. 2)(A~E)
  • 在Ubuntu 18.04下编译OpenJDK 11
  • 为什么要读书?——北京地铁春季书单(2025)
  • 比起追逐爆款,动画行业更需要打开思路“重塑肉身”
  • 北理工:开除宫某党籍,免去行政职务,解除聘用关系
  • 对话地铁读书人|来自法学教授的科普:读书日也是版权日
  • 外交部介绍中印尼“2+2”机制首次部长级会议将讨论的议题
  • 浙江金华一副镇长被指殴打村民,镇党委称仍在调查核实