题目描述

  在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。
并将P对1000000007取模的结果输出。 即输出P%1000000007 
  
  本题采用归并排序,归并排序算法我在前一篇博客里写到过,在那个基础上进行修改即可!(强烈建议先理解归并排序的具体算法后,再来做此题)
public class Solution36 {
private int count = 0; //记录次数
private int[] copy ;
public int InversePairs(int [] array) {
if(array.length == 0) return 0; copy = new int[array.length]; sort(array, 0, array.length-1);
return count%1000000007; } private void sort(int[] array, int start, int end) { if(end <= start) return;
//int mid = start + (end - start) / 2;
int mid = (end+start) /2;
sort(array, start, mid);//左边数组排序
sort(array, mid + 1, end);//右边数组排序 merge(array,start,mid, end); //归并方法
}
/**
* 排序
* @param array 需要排序的数组
* @param start 数组的起始位置
* @param mid 数组的中间位置
* @param end
*/
private void merge(int[] array, int start, int mid, int end) { int i = start, j = mid + 1; //将数组分割成两段,由于归并排序特点,前后两段是有序的 for(int k = start; k <= end; k++){ //复制数组
copy[k] = array[k];
} for(int k= start; k<= end; k++){
if(i > mid) array[k] = copy[j++]; //当只剩下右边数组
else if(j > end) array[k] = copy[i++]; //当只剩下左边数组
else if(copy[i] > copy[j]) {//当前一个数组的数大于后一个数组的数时,逆序(前后数组分界点为mid)
/**
* 例如数组5 6 7 2 4 8进行归并 ,因为归并排序会使数组前后数组有序
* 前一个数组为:5 6 7 ,后一个数组为: 2 4 8
* 当 5 大于 2时,5后面的6,7都会大于2, 且5的最后一个数组下标为mid,
* 所以count = count+ mid - i + 1 然后将2添加到array[k]中
*/
count = (count + mid-i + 1)%1000000007;
array[k] = copy[j++];
}else {
array[k] = copy[i++];
}
} }
}

测试代码:

1   public static void main(String[] args){
Solution36 solution36 = new Solution36();
int[] array = new int[]{3,3,2,4,2,1};
int count = solution36.InversePairs(array);
System.out.println(count);
for (Integer i: array) {
System.out.print(i + " ");
}
}
 
 

剑指offer_数组中的逆序对的更多相关文章

  1. [剑指OFFER] 数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数.     分析:利用归并排序的思想,分成2部分,每一部分按照从大到 ...

  2. 剑指Offer——数组中的逆序对

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

  3. 剑指Offer-34.数组中的逆序对(C++/Java)

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

  4. 用js刷剑指offer(数组中的逆序对)

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

  5. 剑指Offer——数组中的逆序对(归并排序的应用)

    蛮力: 遍历数组,对每个元素都往前遍历所有元素,如果有发现比它小的元素,就count++. 最后返回count取模. 结果没问题,但超时哈哈哈,只能过50%.   归并法: 看讨论,知道了这道题的经典 ...

  6. 剑指 Offer——数组中的逆序对

    1. 题目 2. 解答 借助于归并排序的分治思想,在每次合并的时候统计逆序对.因为要合并的两个数组都是有序的,如果左半部分数组当前值大于右半部分数组当前值,那么左半部分数组当前值右边的数就都大于右半部 ...

  7. 剑指Offer34 数组中的逆序对

    /************************************************************************* > File Name: 34_Invers ...

  8. 剑指offer-数组中的逆序对-数组-python

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

  9. 剑指offer(35)数组中的逆序对

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

随机推荐

  1. 《HelloGitHub月刊》第10期

    前言 这一年感谢大家的支持,小弟这里给大家拜年了! <HelloGitHub月刊>会一直做下去,欢迎大家加入进来提供更多的好的项目. 最后,祝愿大家:鸡年大吉- <HelloGitH ...

  2. MySQL千万级多表关联SQL语句调优

    本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化.   需要优化的查询:使用explain      出现了Using temporary:       ...

  3. mysql 打开sql日志,记录所有sql

    我使用的mysql版本为:5.7.11 win7环境 记录下下载地址,省得每次百度搜了:http://dev.mysql.com/downloads/installer/ mysql 默认没有开启sq ...

  4. 三层——vb.net版

    经过不懈的努力,我的vb.net 版的三层登陆终于实现了.下面将我的成果向大家展示一下. 原则          vb.net的三层登陆跟C#的三层登陆的思想是一样的都是将系统分层--U层只负责与用户 ...

  5. C# Web.config 配置handlers 和 httpHandlers

    <system.web> <httpHandlers> <add verb="*" path="*.js.axd" type=&q ...

  6. Android EclipseIDE技巧

    一.Eclipse配置使用 1.显示行号(Winodw-->Preferences-->General-->Editors-->Text Editors-->勾上右侧的S ...

  7. hibernate注解的简单应用

    注解代替了我们用的*.hbm.xml文件.简少了我们的代码量:应用简单. @Override 用途:重写父类的同名方法 单元测试注解 @Test 用途:用于测试 @Before 用途:单测方法走之前执 ...

  8. javascript学习-对象与原型

    javascript学习-对象与原型 Javascript语言是符合面向对象思想的.一般来说,面向对象思想需要满足以下三个基本要求: 封装,Javascript的对象可以自由的扩充成员变量和方法,自然 ...

  9. Sql 知识点小结

    使用数据库的好处: 1.安全 2.支持多用户操作 3.误删数据比较容易恢复 4.存储较大容量的数据MySql: MYsql AB公司开发的数据库, 现在归属Oracle公司,开元的关系型数据库RDBM ...

  10. californium 框架设计分析

    Californium 源码分析 1. Californium 项目简介 Californium 是一款基于Java实现的Coap技术框架,该项目实现了Coap协议的各种请求响应定义,支持CON/NO ...