leetcode【每日一题】数组中的逆序对 Java

我的leetcode代码都已经上传到我的git仓库

题干

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

示例 1:

输入: [7,5,6,4]
输出: 5

想法

归并排序,合并的时候通过双指针比较大小,
从而获得前边部分比后边部分大的个数

思路可以参考官方题解

Java代码

package daily;
public class ReversePairs {
    int res=0;
    public int reversePairs(int[] nums) {
        if(nums==null||nums.length==0){
            return  0;
        }
        int low=0,high=nums.length-1;
        int [] B=new int[nums.length];
        mergeSort(nums,low,high,B);
        return res;

    }
    void mergeSort(int [] nums,int low,int high,int[]B){
        if(low<high){
            int mid=(low+high)/2;
            mergeSort(nums,low,mid,B);
            mergeSort(nums,mid+1,high,B);
            mergeCount(nums,low,mid,high,B);
        }

        }
    void mergeCount(int[] nums,int low,int mid,int high,int[] B){//详细归并过程
        int i,j,k;
        //将原数组复制到临时数组B中
        if (high + 1 - low >= 0) System.arraycopy(nums, low, B, low, high + 1 - low);
        for(i=mid,j=high,k=high;i>=low&&j>=mid+1;k--){//双指针i,和j起始位置都是各自小组的末尾,循环结束条件就是有一组走完了
            if(B[i]>B[j]){//前一组的指针数大于后一组的指针数
                nums[k]=B[i--];//大的值扔进数组
                res=res+j-mid;//逆序数增加,j-mid是后一组剩余数目
            }else{
                nums[k]=B[j--];
            }
        }


        //下面循环只会执行一个,因为上面循环退出条件是有一组走完了,下面循环就是将没走完的依次复制到原数组
        while(i>=low)nums[k--]=B[i--];
        while(j>=mid+1)nums[k--]=B[j--];
    }

    public static  void main (String[] args){
        ReversePairs reversePairs=new ReversePairs();
        int [] res={7,5,6,4};
        System.out.println(reversePairs.reversePairs(res));
    }



}

我的leetcode代码都已经上传到我的git仓库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值