【剑指Offer】数组中的逆序对
发布日期:2022-02-10 08:55:17
浏览次数:27
分类:技术文章
本文共 1389 字,大约阅读时间需要 4 分钟。
题目
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
思路
直接上了个力扣的代码,自己写了较详细的注释。
题解:
基本思路就是归并的基础上加上计数
视频从6:30开始看就行了
代码
class Solution {public:int mergeSort(vector & nums, vector & tmp, int l, int r) { //递归结束条件,一个数当然是有序的 if (l >= r) { return 0; } //找中间值 int mid = (l + r) / 2; //递归:计算左边的和右边的两个部分的逆序数 int inv_count = mergeSort(nums, tmp, l, mid) + mergeSort(nums, tmp, mid + 1, r); int i = l, j = mid + 1, pos = l; while (i <= mid && j <= r) { if (nums[i] <= nums[j]) { tmp[pos] = nums[i]; ++i; //只在左边比右边小的时候计数 inv_count += (j - (mid + 1)); } else { tmp[pos] = nums[j]; ++j; } ++pos; } //这个过程就是把剩下来没弄进原数组的弄回去 for (int k = i; k <= mid; ++k) { tmp[pos++] = nums[k]; //只在加左边的时候计数 inv_count += (j - (mid + 1)); } for (int k = j; k <= r; ++k) { tmp[pos++] = nums[k]; } //内存拷贝一次 copy(tmp.begin() + l, tmp.begin() + r + 1, nums.begin() + l); return inv_count; } int reversePairs(vector & nums) { int n = nums.size(); vector tmp(n); return mergeSort(nums, tmp, 0, n - 1); }};
转载地址:https://blog.csdn.net/hanmin822/article/details/105957563 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月20日 16时35分57秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【Java语言基础】面向对象
2021-06-30
【CSS基础学习】使用方法以及选择器
2021-06-30
这样学编程,直接原地起飞啊!
2021-06-30
Java初学者如何快速学好Java?
2021-06-30
Java2021最强最新学习路线图(初学者如何快速学好Java)
2021-06-30
Java最新最全入门到精通教程
2021-06-30
Java基础视频教程大全,2021年最新最强的大佬自学路线图
2021-06-30
Java小程序之球球大作战(基于Java线程实现)
2021-06-30
日常Java练习题(方舟SS系列)
2021-06-30
日常Java练习题(方舟最新系列1)
2021-06-30
日常Java练习题(方舟最新系列2)
2021-06-30
日常Java练习题(方舟最新系列3)
2021-06-30
日常Java练习题(方舟最新系列6)
2021-06-30
Java入门到精通第1章(简解IDEA如何导入jar包)
2021-06-30
Navicat Premium 15 完全卸载的方法(Windows10)
2021-06-30
linux/android kernel层读写二进制数据我找了些示例代码
2021-06-30
我这些年的项目管理心得...
2021-06-30
防尘膜对音质的影响
2021-06-30
声腔设计中无前腔的影响
2021-06-30
IMX51---GPIO
2021-06-30