当前位置: 首页 > 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. 扩展方向
  • 动态阈值调整:支持动态变化的成功阈值。
  • 多条件组合:结合多个条件(如药水类型、等级)进行匹配。
  • 实时反馈系统:集成到实时游戏系统中进行高效匹配计算。
http://www.xdnf.cn/news/66691.html

相关文章:

  • ubuntu--汉字、中文输入
  • iso文件在麒麟V10系统上安装达梦数据库
  • 基础服务系列-Jupyter Notebook 支持JavaScript
  • 【技术派后端篇】基于 Redis 实现网站 PV/UV 数据统计
  • 前端笔记-Vue3(上)
  • Spark-SQL 四(实验)
  • 显卡及相关大模型部署需求概述
  • 靠华为脱胎换骨,但赛力斯仍需要Plan B
  • 【Linux网络编程十】网络原理之IP协议【网络层】
  • 悬空引用和之道、之禅-《分析模式》漫谈57
  • SystemWeaver详解:从入门到精通的深度实战指南
  • css3新特性第五章(web字体)
  • 极狐GitLab Git LFS 速率限制如何设置?
  • mysql的binlog,redolog,undolog的区别
  • 安卓垂直进度条
  • 学习深度学习是否要先学习机器学习?工程师的路径选择策略
  • 部署Kimi-VL-A3B-Instruct视频推理
  • AgentGPT开源程序可以在浏览器中组装、配置和部署自主人工智能代理
  • FramePack:让视频生成更高效、更实用
  • 从0到1学习X-File-Storage:一站式文件存储解决方案
  • spark基础介绍
  • C++中函数的实现写在头文件内
  • Linux系统的介绍及操作系统的基本概念
  • 赛灵思Xilinx FPGa XCKU15P‑2FFVA1156I AMD Kintex UltraScale+
  • Qt6文档阅读笔记-RESTful API Server解析
  • 从C语言变量看内存
  • BR_调制特性(RF/TRM/CA/BV-07-C [Modulation Characteristics])
  • [密码学基础]GB与GM国密标准深度解析:定位、差异与协同发展
  • 【C++】基于红黑树的map和set封装实现
  • 美信监控易:易用性卓越的智能运维管理平台