1. 问题背景与需求解析
这个编程题目看似简单,实则考察了算法设计、数据结构选择以及多语言实现能力。核心需求是:给定一个整数数组,统计每个元素在数组中比它大的元素个数。比如输入[5,2,6,1],输出应该是[1,2,0,3]。
在实际开发中,类似需求常见于排名系统、竞争力分析等场景。比如游戏玩家战力排行、电商商品热度排序等场景,都需要快速计算某个实体在群体中的相对位置。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法与复杂度分析
2.1 最直观的双重循环实现
新手最容易想到的是暴力解法——对每个元素遍历整个数组统计比它大的元素数量。以Java为例:
java复制public int[] countLargerNumbers(int[] nums) {
int[] result = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
int count = 0;
for (int j = 0; j < nums.length; j++) {
if (nums[j] > nums[i]) count++;
}
result[i] = count;
}
return result;
}
这种实现时间复杂度是O(n²),当n较大时(比如10⁵量级)性能会急剧下降。我在实际项目中曾遇到过类似情况——一个排行榜功能在测试环境运行正常,上线后随着用户量增长导致接口超时。
2.2 各语言实现差异
虽然算法逻辑相同,但不同语言的实现细节值得注意:
- Java:需要预先分配结果数组,注意数组越界问题
- JavaScript:可以使用map等高阶函数简化代码
- Python:利用列表推导式可以写出更简洁的实现
3. 优化思路与算法选择
3.1 排序+二分查找优化
更高效的方案是先排序,再利用二分查找确定元素排名。具体步骤:
- 创建数组的排序副本
- 对每个元素,在排序数组中用二分查找确定其位置
- 比它大的元素数量 = 数组长度 - 位置 - 1
Java实现示例:
java复制public int[] countLargerNumbers(int[] nums) {
int[] sorted = Arrays.copyOf(nums, nums.length);
Arrays.sort(sorted);
int[] result = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
int pos = binarySearch(sorted, nums[i]);
result[i] =
