归并的运用——计算逆序数
这篇题解介绍了如何用归并排序在 O(n log n) 时间内计算数组逆序对。问题规模与方法选择输入规模达到 1e5,暴力双循环 O(n^2) 不可行。需要借助分治方法在排序过程中同步统计逆序关系。归并排序天然适合承载这一统计逻辑。统计核心先递归划分左右子区间并各自排序。合并时若 left[i] > right[j],则…
题目 题目链接 题目题目解析 很明显此题的问题规模来到了 1e5 的级别,显然不是 O(n^2) 的暴力方式能够解决的。 具体的详细解析,这里有力扣大神在:题目解析 我这里把最关键的图解过程扣了下来: 归并过程解题代码 配上这简洁清晰的解题代码:class Solution { public: int reversePairs(vector<int>& nums) { vector<int> tmp(nums.size()); return mergeSort(0, nums.size() - 1, nums, tmp); } private: int mergeSort(int l, int r, vector<int>& nums, vector<int>& tmp) { // 终止条件 if (l >= r) return 0; // 递归划分 int m = (l + r) / 2; int res = mergeSort(l, m, nums, tmp) + mergeSort(m + 1, r, nums, tmp); // 合并阶段 int i = l, j = m + 1; for (int k = l; k <= r; k++) tmp[k] = nums[k]; for (int k = l; k <= r; k++) { if (i == m + 1) nums[k] = tmp[j++]; else if (j == r + 1 || tmp[i] <= tmp[j]) nums[k] = tmp[i++]; else { nums[k] = tmp[j++]; res += m - i + 1; // 统计逆序对 } } return res; } };
正在初始化 WebAssembly 引擎…
首次编译原生模块可能需要数秒
就绪后,页面交互将以接近原生的速度运行