题目描述

  在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数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. FMS中的onStatus

    在FlashCom中的Camera, Microphone, LocalConnection, NetConnection,NetStream和 SharedObject对象都提供了事件响应,onst ...

  2. 有效的GOCsharpHelper1.0(源代码开放)

    csharp编写界面,调用基于opencv的图像处理类库,是解决一类问题的优良方法.经过不懈研究,有最新进展: 一.目前情况和优点        位置在11.通过clr             架在c ...

  3. FP Tree算法原理总结

    在Apriori算法原理总结中,我们对Apriori算法的原理做了总结.作为一个挖掘频繁项集的算法,Apriori算法需要多次扫描数据,I/O是很大的瓶颈.为了解决这个问题,FP Tree算法(也称F ...

  4. 如何使用矩阵乘法加速动态规划——以[SDOI2009]HH去散步为例

    对这个题目的最初理解 开始看到这个题,觉得很水,直接写了一个最简单地动态规划,就是定义 f[i][j]为到了i节点路径长度为j的路径总数, 转移的话使用Floyd算法的思想去转移,借助这个题目也理解了 ...

  5. linux上静态库链接的有关问题

    求大神,linux下静态库链接的问题有两个文件和一个库,a.c, b.c,libh.a,其中b.c里面会有调用libh.a的函数func1,现在将a.c, b.c,libh.a编译链接生成可执行文件, ...

  6. Introduce: IEPI.BIATranscribe 图像表格拓写工具

    应用场合 数据表格是学术.文案工作中常用的表述形式.我们经常需要从第三方获取所需的数据.有些时候这些数据并非以可直接编辑的形式(如电子表格文档),而是以打印件或者扫描件的形式提供.假如需要对数据进行进 ...

  7. C语言高效位操作

    思考: 1. 如何将一个数据中的多个不连续位清位? 1. 如何将一个数据中的多个不连续位置位? 1. 如何反转一个数据中的多个不连续位(1->0, 0->1)? 基础知识:C 语言位操作 ...

  8. std::list 源代码解析

    首先声明,下面的讲解都是针对GCC2.9,std::alloc 通过下面的源代码大家可以看到list类的内部成员是一个node,而他的类型是linktype,前面的typedef里面有介绍是一个指针, ...

  9. UI 常用(UIButton)

    1.手势 UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@sele ...

  10. IOS9.0 之后友盟分享详细过程

    一: 申请友盟的AppKey(友盟的Key是根据应用的名称生成的!) 在友盟注册了你自己的开发者账号后就可以申请AppKey了.然后在这个方法里面设置Key - (BOOL)application:( ...