【剑指offer】数组中的逆序对,C++实现
2024-09-01 07:36:39
原创博文,转载请注明出处!
本题牛客网地址
1.题目
2.思路
3.代码
1 class Solution {
2 public:
3 int InversePairs(vector<int> data) {
4 if(data.size() == 0){
5 return 0;
6 }
7 // 排序的辅助数组
8 vector<int> copy;
9 for(int i = 0; i < data.size(); ++i){
10 copy.push_back(data[i]);
11 }
12 return InversePairsCore(data, copy, 0, data.size() - 1) % 1000000007;
13 }
14 long InversePairsCore(vector<int> &data, vector<int> ©, int begin, int end){
15 // 如果指向相同位置,则没有逆序对。
16 if(begin == end){
17 copy[begin] = data[end];
18 return 0;
19 }
20 // 求中点
21 int mid = (end + begin) >> 1;
22 // 使data左半段有序,并返回左半段逆序对的数目
23 long leftCount = InversePairsCore(copy, data, begin, mid);
24 // 使data右半段有序,并返回右半段逆序对的数目
25 long rightCount = InversePairsCore(copy, data, mid + 1, end);
26
27 int i = mid; // i初始化为前半段最后一个数字的下标
28 int j = end; // j初始化为后半段最后一个数字的下标
29 int indexcopy = end; // 辅助数组复制的数组的最后一个数字的下标
30 long count = 0; // 计数,逆序对的个数,注意类型
31
32 while(i >= begin && j >= mid + 1){
33 if(data[i] > data[j]){
34 copy[indexcopy--] = data[i--];
35 count += j - mid;
36 }
37 else{
38 copy[indexcopy--] = data[j--];
39 }
40 }
41 for(;i >= begin; --i){
42 copy[indexcopy--] = data[i];
43 }
44 for(;j >= mid + 1; --j){
45 copy[indexcopy--] = data[j];
46 }
47 return leftCount + rightCount + count;
48 }
49 };
最新文章
- ecshop 后台分页功能
- Y+的一些讨论
- Timer和DPC
- 模拟淘宝使用cookie记录登录名,
- Java中数据库连接池原理机制的详细讲解以及项目连接数据库采用JDBC常用的几种连接方式
- Chap6: question38 - 42
- Objective-C的对象模型
- hdu 4605 Magic Ball Game
- Photography theory: a beginner&#39;s guide(telegraph.co.uk)
- dede标签:定义文件夹
- [UWP]新控件ColorPicker
- springboot中配置文件application.properties的理解
- Git 帮助
- 25. Reverse Nodes in k-Group (JAVA)
- Codeforces Round #436 (Div. 2)D. Make a Permutation! 模拟
- 常用类:Object
- 【转】 pthread设置线程的调度策略和优先级
- iOS 项目一直在后台执行
- 升级cocoapods1.1.1版本
- 两条命令在Linux主机之间建立信任关系