剑指offer:数组中的逆序对
2017-07-03 12:22
363 查看
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数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 ; 4000 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); } } };
相关文章推荐
- [剑指offer][面试题36]数组中的逆序对
- 剑指offer-第五章优化时间和空间效率(数组中的逆序对的总数)
- 剑指OFFER_求数组中逆序对的个数
- 【剑指Offer学习】【面试题36:数组中的逆序对】
- 剑指Offer:数组中的逆序对
- 码农小汪-剑指Offer之33 -数组中的逆序对 冒泡排序 归并排序
- 【剑指offer】面试题51:数组中的逆序对
- 剑指offer 编程题(34):数组中的逆序对
- 剑指offer33--数组中的逆序对
- 剑指Offer-51:数组中的逆序对
- 【剑指offer】之数组中的逆序对
- 剑指Offer--036-数组中的逆序对
- 剑指offer:数组中的逆序对
- 剑指offer——面试题36:数组中的逆序对
- 【剑指Offer面试编程题】题目1348:数组中的逆序对--九度OJ
- 剑指offer 面试题36:数组中的逆序对
- 【剑指offer】数组中的逆序对
- 剑指offer_数组中的逆序对
- 剑指offer---数组中的逆序对
- 【九度OJ1348】|【剑指offer36】数组中的逆序对