数组中的逆序对

题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007

题目链接: 数组中的逆序对

代码

/**
* 标题:数组中的逆序对
* 题目描述
* 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
* 题目链接:
* https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&&tqId=11188&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
*/
public class Jz35 { private long cnt = 0;
private int[] tmp; // 在这里声明辅助数组,而不是在 merge() 递归函数中声明 public int inversePairs(int[] array) {
tmp = new int[array.length];
mergeSort(array, 0, array.length - 1);
return (int) (cnt % 1000000007);
} private void mergeSort(int[] nums, int l, int h) {
if (h - l < 1) {
return;
}
int m = l + (h - l) / 2;
mergeSort(nums, l, m);
mergeSort(nums, m + 1, h);
merge(nums, l, m, h);
} private void merge(int[] nums, int l, int m, int h) {
int i = l, j = m + 1, k = l;
while (i <= m || j <= h) {
if (i > m) {
tmp[k] = nums[j++];
} else if (j > h) {
tmp[k] = nums[i++];
} else if (nums[i] <= nums[j]) {
tmp[k] = nums[i++];
} else {
tmp[k] = nums[j++];
this.cnt += m - i + 1; // nums[i] > nums[j],说明 nums[j..mid] 都大于 nums[j]
}
k++;
}
for (k = l; k <= h; k++) {
nums[k] = tmp[k];
}
} public static void main(String[] args) { }
}

【每日寄语】 每一天都是全新的开始,每一天都会有最好的运气。

最新文章

  1. .html(),.text()和.val()的差异总结
  2. Python 之路 Day5 - 常用模块学习
  3. 去掉win10桌面小图标
  4. Java菜鸟培训第二天
  5. asp.net TreeView控件绑定数据库显示信息
  6. IEHelper - Internet Explorer Helper Class
  7. 表单数据校检方法 onsubmit()的使用?
  8. web工程中地址的写法
  9. Ajax (AppServ服务器练习)
  10. Java代码编写规范(不是标准规范,自行整理,无须纠结)
  11. css img换行之后有空隙
  12. 图解HTTP(1)之WEB及网络基础
  13. numpy处理时间序列
  14. linux系统原子操作
  15. [PHP] 04 - Upload files
  16. jquery小结收藏
  17. stm32常识
  18. (转) lsof 一切皆文件
  19. JQuery 获得元素的方法
  20. ruby gem tips(转)

热门文章

  1. PyTorch 介绍 | TRANSFORMS
  2. CaCl2 项目介绍。
  3. Abp 审计模块源码解读
  4. 让HTML和JSP页面不缓存从Web服务器上重新获取页面
  5. JavaScript检查Date对象是否为Invalid Date
  6. linux 多个C源文件编译
  7. Spring 是怎么处理循环依赖的?
  8. 【第十八期】分享一个网易go面经
  9. Solution -「多校联训」小卖部
  10. Linux上大文件切割以及批量并发处理