LintCode:532 逆序对

原创 2018年04月15日 16:09:14

题目:


分析:

方法一:找出所有的数对,在判断它们是否为逆序对,时间复杂度为O(n^2),因此很可能不能通过。

public long reversePairs(int[] A) {
        // write your code here
        long count=0;
        for(int i=0;i<A.length-1;i++){
            for(int j=i+1;j<A.length;j++){
                if(A[i]>A[j])   count++;
            }
        }
        return count;
    }

方法二:采用归并排序的思想来统计逆序对的个数,合并两部分子数组的时候,如1,3,5,7,9,2,4,6,8时,low=1,high=8,mid=9,i=3,j=2时,则包括3在内的3,5,7,9都能与2构成逆序对,因为左半部分数组是递增有序的,所以构成逆序对的个数为mid-i+1。

//使用归并排序
    public long reversePairs1(int[] A) {
        if(A==null || A.length==0)  return 0;
        return mergesort(A,0,A.length-1);
    }

    public long mergesort(int[] A,int low, int high){
        long count=0;
        if(low==high)   return 0;
        else{
            int mid=(low+high)/2;
            count+=mergesort(A,low,mid);
            count+=mergesort(A,mid+1,high);
            count+=MergeTwoData(A,low,mid,high);
        }
        return count;
    }

    public long MergeTwoData(int[] A,int low,int mid,int high){
        long count=0;
        int[] arr=new int[high-low+1];
        int i=low; int m=mid;
        int j=mid+1; int n=high;
        int index=0;
        while(i<=m && j<=n){
            if(A[i]<=A[j])
                arr[index++]=A[i++];
            else{
                arr[index++]=A[j++];
                count+=mid-i+1;
            }
        }
        while(i<=m) {
            arr[index++] = A[i++];
        }
        while(j<=n) {
            arr[index++] = A[j++];
        }
        //写回原数组
        int k=0;
        for(int o=low;o<=high;o++)
            A[o]=arr[k++];
        return count;
    }

用VB编写异步多线程下载程序

用VB编写异步多线程下载程序大庆油田有限公司勘探开发研究院网络室 满孝 为了高效率地下载某站点的网页,我们可利用VB的Internet Transfer 控件编写自己的下载程序, Internet T...
  • hktl
  • hktl
  • 2001-03-30 01:30:00
  • 1074

LINTCODE——逆序对

LINTCODE——逆序对思路:本来直接统计的,结果TIMEOUT,后来改用归并排序统计,通过了,就一个注意的,数组num分成L,mid,R三段时,如果L...
  • kaaokou
  • kaaokou
  • 2017-09-19 16:25:28
  • 236

LintCode:逆序对

在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的总数。 概括:如果a[i] > a[j] 且 i 您在真实的面试中是否遇到过这个...
  • zyf19930610
  • zyf19930610
  • 2016-12-08 23:23:58
  • 445

[LintCode] 逆序对 Reverse Pairs

在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的总数。 概括:如果a[i] > a[j] 且 i < j, a[i] 和 a[j] ...
  • wutingyehe
  • wutingyehe
  • 2016-04-26 16:11:43
  • 2606

【hiho39】二分·归并排序之逆序对

最近申请了微软的暑假实习,4号就要在线笔试了,在线测试系统用的是http://hihocoder.com/,今天试手做了一道题。 【题目】 原题链接:http://hihocoder.com/co...
  • ljiabin
  • ljiabin
  • 2015-04-02 00:32:44
  • 1643

[LintCode]532.逆序对

在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的总数。 概括:如果a[i] > a[j] 且 i 样例 序列 [2, ...
  • zwy1258432405
  • zwy1258432405
  • 2017-08-18 18:24:33
  • 131

来来来 再来一个逆序对 493. Reverse Pairs

493. Reverse Pairs 我以后要常下象棋!可以锻炼细心程度! public class Solution { public int reversePa...
  • chengdezhi2011
  • chengdezhi2011
  • 2017-03-01 23:56:00
  • 597

lintcode 逆序对(Reverse Pairs )(Java)

题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的总数。 概括:如果a[i] > a[j] 且 i < j, a[i] ...
  • C_calary
  • C_calary
  • 2017-07-11 13:39:55
  • 409

lintcode,逆序对

在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的总数。 概括:如果a[i] > a[j] 且 i < j, a[i] 和 a[j] ...
  • zsjmfy
  • zsjmfy
  • 2016-12-22 11:27:56
  • 279

532 - 逆序对

5.19 1.最开始用的两个for循环,不用想,一定超时了。 2.又现学了归并排序,但是好像网上只有二路归并排序,我还没有找到其他的方法,有机会也是要学习一下的。 3.将分治的思想用在这道题中,...
  • Missbubu
  • Missbubu
  • 2017-05-19 09:07:09
  • 121
收藏助手
不良信息举报
您举报文章:LintCode:532 逆序对
举报原因:
原因补充:

(最多只允许输入30个字)