剑指offer:数组中的逆序对
来源:互联网 发布:db2 设置数据库编码 编辑:程序博客网 时间:2024/05/29 09:35
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
class Solution {public: long InversePairsCore( vector<int> &data, vector<int> ©, long start, long end){ if(start == end) // copy: 辅助数组 { return 0 ; // 递归终止条件 } long mid = (start + end)/ 2 ; long left = InversePairsCore(copy,data, start, mid); // 递归,归并排序,并计算本次逆序对数 long right = InversePairsCore(copy,data, mid+1, end); long crossCount = 0 ; // 记录交叉的逆序对数 long i = mid, j = end, temp = end; //i:前半部分的下标,j:后半部分的下标,temp:辅助数组的下标 while(i >= start && j >= mid+1) { // 存在交叉的逆序对,先统计一下,然后依次将较大值放进辅助数组 if (data[i] > data[j]) { copy[temp--] = data[i--]; crossCount += j - start - (mid-start); } else { copy[temp--] = data[j--]; // 不存在交叉的逆序对,依次将较大值放进辅助数组 } } while(i >= start) { copy[temp--] = data[i--]; } while(j >=mid+1) { copy[temp--] = data[j--]; } return (left + right + crossCount) % 1000000007; //数值过大时求余, 防止溢出 } int InversePairs(vector<int> &data) { if(data. size () == 0 ) return 0 ; else if (data. size() == 1 ) return 1 ; else { vector<int> copy(data); return InversePairsCore(copy, data, 0 , data.size()- 1); } }};
阅读全文
0 0
- 【剑指offer】数组中的逆序对
- 剑指offer 36 数组中的逆序对
- 剑指offer--数组中的逆序对
- 剑指Offer之 - 数组中的逆序对
- 剑指offer之数组中的逆序对
- 剑指offer 36 - 数组中的逆序对
- 《剑指offer》数组中的逆序对
- 【剑指offer】数组中的逆序对
- 剑指offer—数组中的逆序对
- 【剑指offer】之数组中的逆序对
- 剑指offer:数组中的逆序对
- [剑指offer]数组中的逆序对
- 剑指offer:数组中的逆序对
- 剑指Offer--036-数组中的逆序对
- [剑指offer]数组中的逆序对
- 《剑指offer》:[36]数组中的逆序对
- 《剑指offer》-数组中的逆序对
- 数组中的逆序对(剑指offer)
- 运算符和表达式
- 【淘淘】---选择类目
- How to read the environment variables in groovy email template 邮件模板中读取系统环境变量
- Android解压ZIP文件
- 初学ui设计的一些注意事项
- 剑指offer:数组中的逆序对
- 《深入分析javaweb技术内幕》之一——SpringMVC的工作机制与设计模式
- hive查过的函数
- 008_WaitForSingleObject应用
- 循环结构(while、do…while、for)
- Android app安装常见错误描述
- 循环问题、数组
- C/C++ strtok
- 选择项目管理工具,请避开这六大雷区