JAVA程序设计: 数组中的逆序对(LeetCode:面试题51)

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

示例 1:

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

限制:

0 <= 数组长度 <= 50000

思路:考察一般求逆序数的方法,往往有两种:树状数组或者归并排序,两种都非常好实现,这里我用归并写了一下。

class Solution {
	
	private int ans;
	
    public int reversePairs(int[] nums) {
        
    	ans=0;
    	
    	merge(nums,0,nums.length-1);

    	return ans;
    }
    
    private void merge(int[] nums,int l,int r) {
    	if(l<r) {
    		int mid=(l+r)/2;
    		merge(nums,l,mid);
    		merge(nums,mid+1,r);
    		mergeSort(nums,l,mid,r);
    	}
    }
    
    private void mergeSort(int[] nums,int l,int mid,int r) {
    	int[] arr=new int[r-l+1];
    	int ls=l,rs=mid+1,len=0;
    	while(ls<=mid && rs<=r) {
    		if(nums[ls]<=nums[rs])
    			arr[len++]=nums[ls++];
    		else {
    			ans+=mid-ls+1;
    			arr[len++]=nums[rs++];
    		}
    	}
    	
    	while(ls<=mid) arr[len++]=nums[ls++];
    	while(rs<=r) arr[len++]=nums[rs++];
    	
    	for(int i=0;i<len;i++)
    		nums[l+i]=arr[i];
    }
}
原创文章 1111 获赞 194 访问量 25万+

猜你喜欢

转载自blog.csdn.net/haut_ykc/article/details/105722602