剑指 Offer 51. 数组中的逆序对
数组 Offer 51 逆序
2023-09-11 14:19:00 时间
思路
方法:归并排序求逆序对
题解思路来自:力扣官方题解 - 数组中的逆序对
复杂度分析
1 class Solution { 2 public: 3 int reversePairs(vector<int>& nums) { 4 vector<int> tmp(nums.size()); 5 return mergeSort(nums, tmp, 0, nums.size()-1); 6 } 7 8 int mergeSort(vector<int> &nums, vector<int>& tmp, int L, int R) { 9 if(L >= R) { 10 return 0; 11 } 12 13 int reversePairsNum = 0; 14 int mid = (L + R) / 2; 15 reversePairsNum = mergeSort(nums, tmp, L, mid) + mergeSort(nums, tmp, mid+1, R); 16 17 int k = 0; 18 int i = L, j = mid+1; 19 while(i <= mid && j <= R) { 20 if(nums[i] <= nums[j]) { 21 tmp[k++] = nums[i++]; 22 reversePairsNum += j-1-mid; //第i个元素和区间[mid+1, j-1]中的每个元素组成一个逆序对 23 } else { 24 tmp[k++] = nums[j++]; 25 } 26 } 27 28 while(i <= mid) { 29 tmp[k++] = nums[i++]; 30 reversePairsNum += j-1-mid; //注意:执行此循环的时候说明j已经等于R+1了 31 } 32 33 while(j <= R) { 34 tmp[k++] = nums[j++]; //注意:执行此循环的时候说明i已经等于mid+1了 35 } 36 37 copy(tmp.begin(), tmp.begin()+k, nums.begin()+L); 38 39 return reversePairsNum; 40 } 41 };
相关文章
- 最大子数组和
- JavaScript之数组
- Java实现 LeetCode 457 环形数组循环
- Java实现 LeetCode 442 数组中重复的数据
- 分享五:php数组操作
- javascript-数组的常用方法
- (算法:二分查找)在排序数组中,找出给定数字出现的次数
- (剑指Offer)面试题51:数组中重复的数字
- (剑指Offer)面试题31:连续子数组的最大和
- (剑指Offer)面试题52:构建乘积数组
- LeetCode-2488. 统计中位数为 K 的子数组【哈希表,前缀和】
- 对某整型二维数组a[4][6],初始化填入一些浮点数,分别求其各行、各列以及所有数之乘积, 并显示数组的数据与计算结果。
- golang代码示例:使用数组一个堆栈
- 剑指 Offer II 009. 乘积小于 K 的子数组
- 剑指 Offer II 006. 排序数组中两个数字之和-哈希表法
- 剑指 Offer II 076. 数组中的第 k 大的数字
- 剑指 Offer 53 - I. 在排序数组中查找数字 I
- 剑指 Offer II 012. 左右两边子数组的和相等(有点意思)
- php 多维数组如何用foreach遍历修改其中的一个值
- 剑指 Offer 53 - I. 在排序数组中查找数字 I
- 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
- 【LeetCode 】剑指 Offer 04. 二维数组中的查找
- python工具方法 3 numpy多维数组清洗,删除任意维度的数组,仅保留感兴趣的一维数据
- Shell全解析(二):字符串变量和数组变量