【Java】力扣_每日一题_面试题51. 数组中的逆序对_困难

本文探讨了使用归并排序算法解决LeetCode中数组逆序对计数的问题,对比了原始暴力解法与归并排序的效率,强调了在大数据集下归并排序的优越性。

题目链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/

题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

第一次编辑代码:

class Solution {
    public int reversePairs(int[] nums) {
        int ans = 0;
        int n = nums.length;
        for(int i = 0; i < n; i++)
            for(int j = i + 1; j < n; j++)
                if(nums[i] > nums[j])
                    ans++;
        return ans;
    }
}

提交结果
超出时间限制。

反思
果然,看了下这道题应该用归并。

在 LeetCode 平台上,“小和问题”通常指的是与数组中每个元素左边比它小的元素之和相关的问题。这类问题在算法面试中较为常见,但 LeetCode 平台上并没有直接以“小和问题”命名的题目。类似问题通常涉及归并排序的变种实现,或使用树状数组(Fenwick Tree)来高效逆序对或前缀和相关的问题。 如果目标是寻找与“小和”相关的题目,可以参考以下几道题: - **剑指 Offer 51. 数组中的逆序对**:虽然题目是逆序对的数量,但其解法中涉及的归并排序思想可以用于计算每个元素右边比它小的元素数量,与“小和”问题紧密相关。 - **LeetCode 493. 翻转对**:该题要找出数组中满足一定条件的数对数量,其解法也可以基于归并排序实现。 - **LeetCode 315. 计算右侧小于当前元素的个数**:该题与“小和问题”非常相似,只是关注的是比当前元素小的数在右边的情况。 如果希望找到一个题目来练习与“小和”相关的算法,推荐使用 **LeetCode 315. 计算右侧小于当前元素的个数**,因为它与“小和问题”的核心思想非常接近[^5]。 ```python # 示例:LeetCode 315 的 Python 实现(归并排序变种) class Solution: def countSmaller(self, nums: List[int]) -> List[int]: indices = list(range(len(nums))) count = [0] * len(nums) def merge_sort(enum): if len(enum) <= 1: return enum mid = len(enum) // 2 left = merge_sort(enum[:mid]) right = merge_sort(enum[mid:]) i = j = 0 merged = [] while i < len(left) and j < len(right): if nums[left[i]] > nums[right[j]]: merged.append(left[i]) count[left[i]] += len(right) - j i += 1 else: merged.append(right[j]) j += 1 merged.extend(left[i:]) merged.extend(right[j:]) return merged merge_sort(indices) return count ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值