news 2026/4/26 7:26:52

千问 LeetCode 1862.向下取整数对和 public int sumOfFlooredPairs(int[] nums)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
千问 LeetCode 1862.向下取整数对和 public int sumOfFlooredPairs(int[] nums)

这是一道经典的算法题,考察的是前缀和与数论分块(倍数枚举)的思想。

如果直接暴力枚举每一对 (i, j),时间复杂度是 O(N^2),在数据量较大时会超时。我们需要转换思路:不直接计算每一对,而是计算每一个数字作为分母时,它能对总和贡献多少。

以下是完整的 Java 代码实现及详细解析:

🚀 核心思路

1. 统计频率:首先统计数组中每个数字出现的次数。
2. 前缀和预处理:计算前缀和数组,这样我们可以在 O(1) 的时间内查询任意区间 [L, R] 内有多少个数组中的元素。
3. 枚举分母与倍数:
* 遍历每一个出现过的数字 x 作为分母。
* 对于分母 x,我们枚举它的倍数 k(即商为 k)。
* 当分母为 x,商为 k 时,被除数(分子)的取值范围是 [k cdot x, (k+1) cdot x - 1]。
* 利用前缀和快速算出这个范围内有多少个数字,乘以 k(商)和 x 的出现次数,累加到答案中。

💻 Java 代码实现

import java.util.Arrays;

class Solution {
private static final int MOD = 1000000007;

public int sumOfFlooredPairs(int[] nums) {
// 1. 找到数组中的最大值,确定计数数组的大小
int maxVal = Arrays.stream(nums).max().getAsInt();

// 2. 统计每个数字出现的频率
// count[i] 表示数字 i 在 nums 中出现的次数
int[] count = new int[maxVal + 1];
for (int num : nums) {
count[num]++;
}

// 3. 计算前缀和
// prefixSum[i] 表示数值在 [0, i] 范围内的元素总个数
// 这样可以在 O(1) 时间内查询区间 [L, R] 内的元素个数
int[] prefixSum = new int[maxVal + 1];
prefixSum[0] = count[0];
for (int i = 1; i 0 ? prefixSum[lowerBound - 1] : 0);

if (countInRange > 0) {
// 贡献值 = (该范围内元素个数) * (商 k) * (分母出现的次数)
// 分母出现次数是因为数组中可能有多个相同的分母
long contribution = (long) countInRange * k * count[denominator];
ans = (ans + contribution) % MOD;
}
}
}

return (int) ans;
}
}

🧠 详细步骤解析

1. 为什么使用前缀和?
题目要求计算 sum lfloor frac{nums[i]}{nums[j]} rfloor。
如果我们固定分母 nums[j] = x,那么对于不同的分子 nums[i],lfloor frac{nums[i]}{x} rfloor 的结果是分段的。
例如 x=2:
* 分子在 [0, 1],结果为 0
* 分子在 [2, 3],结果为 1
* 分子在 [4, 5],结果为 2
* ...
* 分子在 [2k, 2k+1],结果为 k

前缀和数组 prefixSum 让我们能瞬间算出数组中有多少个元素落在 [2k, 2k+1] 这个区间内,而不需要遍历整个数组。

2. 复杂度分析
* 时间复杂度:O(M log M),其中 M 是数组中的最大值。
* 外层循环遍历分母,最多 M 次。
* 内层循环枚举倍数(商),对于分母 x,循环次数约为 M/x。
* 总次数约为 M/1 + M/2 + M/3 + ... + M/M = M times (1 + 1/2 + ... + 1/M) approx M ln M。
* 空间复杂度:O(M),用于存储频率数组和前缀和数组。

3. 举例说明
假设 nums = [2, 5, 9]:
* 频率:count[2]=1, count[5]=1, count[9]=1。
* 当分母为 2 时 (count[2]=1):
* 商为 1:分子范围 [2, 3]。数组中有 1 个 (即2)。贡献 1 times 1 times 1 = 1。
* 商为 2:分子范围 [4, 5]。数组中有 1 个 (即5)。贡献 1 times 2 times 1 = 2。
* 商为 3:分子范围 [6, 7]。无。
* 商为 4:分子范围 [8, 9]。数组中有 1 个 (即9)。贡献 1 times 4 times 1 = 4。
* 分母为 2 的总贡献:1+2+4=7。
* 当分母为 5 时:
* 商为 1:分子范围 [5, 9]。有 2 个 (5, 9)。贡献 2 times 1 times 1 = 2。
* 当分母为 9 时:
* 商为 1:分子范围 [9, 17]。有 1 个 (9)。贡献 1 times 1 times 1 = 1。
* 总和:7 + 2 + 1 = 10。

这个逻辑与题目示例完全吻合。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 7:26:34

合成数据与强化学习训练CLI智能代理实战

1. 项目概述:用合成数据与强化学习训练CLI操作AI代理想象一下,当你面对一个全新的命令行工具时,如果能有个"数字助手"不仅能理解你的自然语言指令,还能准确生成对应的命令行操作——而且每次执行前都会礼貌地征求你的确…

作者头像 李华
网站建设 2026/4/26 7:23:27

如何在Windows上完美重温Flash游戏:CefFlashBrowser终极指南

如何在Windows上完美重温Flash游戏:CefFlashBrowser终极指南 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 你是否还在为无法玩经典的Flash游戏而烦恼?当现代浏览…

作者头像 李华
网站建设 2026/4/26 7:20:22

Haystack框架实战:从零构建基于RAG的智能问答系统

1. 项目概述:一个为构建智能搜索与问答系统而生的框架如果你正在为你的应用或业务数据寻找一个强大的、开源的、能够处理复杂检索与生成任务的AI框架,那么你很可能已经听说过或者正在寻找类似deepset-ai/haystack这样的工具。简单来说,Haysta…

作者头像 李华
网站建设 2026/4/26 7:19:20

英雄联盟玩家必备:LeagueAkari 终极本地自动化工具完整指南

英雄联盟玩家必备:LeagueAkari 终极本地自动化工具完整指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit LeagueAkari 是一款专为…

作者头像 李华
网站建设 2026/4/26 7:14:59

2022年半导体与单板计算机技术回顾与趋势分析

1. 2022年半导体与单板计算机行业回顾2022年对嵌入式系统和开源硬件社区而言是充满挑战与机遇的一年。作为从业十余年的技术博主,我观察到全球芯片短缺持续影响着产业供应链,但同时也催生了更多创新解决方案。Rockchip RK3588八核处理器的发布无疑是Arm阵…

作者头像 李华
网站建设 2026/4/26 7:14:58

5个必学技巧:用哔哩下载姬downkyi轻松实现批量下载的终极指南

5个必学技巧:用哔哩下载姬downkyi轻松实现批量下载的终极指南 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等…

作者头像 李华