逆序对

数组中的逆序对

http://www.nowcoder.com/questionTerminal/96bd6684e04a44eb80e6a68efc0ec6c5

最简单的方法,根本过不了。

public class Solution {
    public int InversePairs(int [] array) {
        int l = array.length;
        int sum = 0;
        for(int i=0;i<l-1;i++){
            for(int j=i+1;j<l;j++){
                if(array[i]>array[j]){
                    sum++;
                }
            }
            sum = sum % 1000000007;
        }
        return sum;
    }
}

看大佬们的题解 大部分都是归并排序来做的,归并排序(升序)的时候遇到左边需要调整到右边去的元素时既可以计算逆序对的个数了,
本身左边和右边都是有序的,所以当左边的i比右边的j要大时,左边比i大的数一定也比右边的j要大,这样就有 i-mid+1 个逆序对了。继续合并继续计算其他的逆序对

public class Solution {
    public int sum = 0;
    public void mergeSort(int[] array, int start, int end){
        if(start>=end){
            return;
        }
        int mid = (start+end)/2;
        mergeSort(array, start, mid);
        mergeSort(array, mid+1, end);
        merge(array, start, mid, end);
    }
    public void merge(int[] array, int start, int mid, int end){
        // 存合并之后的数组的
        int l = end-start+1;
        int[] temp = new int[l];
        // 前面数组的起始
        int i = start;
        // 后面数组的起始
        int j = mid+1;
        // temp的下标
        int k = 0;
        // 把小的往前放。
        while(i<=mid&&j<=end){
            // 把小的存到前面
            if(array[i]<=array[j]){
                temp[k] = array[i];
                i++;
            }else {
                temp[k] = array[j];
                j++;
                // 如果当前i的元素大于后面的元素,那么当前i元素之后的(从i到mid)所有元素都能和j指向的元素构成逆序对。
                sum = (sum+(mid-i+1))%1000000007;
            }
            k++;
        }

        // 剩下哪个数组没合并完,就把它全拷贝到后面
        while(i<=mid){
            temp[k] = array[i];
            i++;
            k++;
        }
        while(j<=end){
            temp[k] = array[j];
            j++;
            k++;
        }
        // 合并完的拷贝回去
        for(k=0;k<l;k++){
            array[start+k] = temp[k];
        }

    }
    public int InversePairs(int [] array) {
        mergeSort(array, 0, array.length-1);
        return sum;
    }
}
全部评论

相关推荐

牛客83700679...:简历抄别人的,然后再投,有反馈就是简历不行,没反馈就是学历不行,多投多改只要技术不差机会总会有的
点赞 评论 收藏
分享
来个厂收我吧:首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-15 17:32
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务