剑指Offer:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出

这篇博客探讨了如何解决数组中逆序对计数的问题。初始的双层循环方法导致运行超时,因此作者转向使用归并排序算法,该算法的时间复杂度为O(n log n)。通过将数组不断分割并合并,同时计算逆序对,最终得到数组中的逆序对总数,并对其取模1000000007得到结果。
摘要由CSDN通过智能技术生成

一开始,我用两次循环来计算逆序数,编译器显示不通过:运行超时.

 

之后想到归并排序,时间复杂度为nlogn.

 

归并排序的思想是:将一个数组分为两个数组,....最终让每个数组只有一个元素,计算逆序数,并实行合并与排序.

代码实现:

public class Solution{
	int count = 0; 
	public int InversePairs(int [] array) {
		if(array != null && array.length != 0){
            int[] tmpArr = new int[array.length];
            mergeSort(array,0,array.length-1,tmpArr);
        }
        return count;
	}

	public void mergeSort(int[] array,int start,int end,int[] tmpAddr) {
		if(start>=end) {
			return;
		}
		int mid = (start+end)/2;
		mergeSort(array, start, mid, tmpAddr);
		mergeSort(array, mid+1, end, tmpAddr);
		merge(array, start, mid, end, tmpAddr);
	}
	public void merge(int[] array ,int start,int mid,int end,int[] tmpAddr) {
		int tmpIndex = start;
		int start2 = mid+1;
		int i = start;
		while(start<=mid&&start2<=end) {
			if(array[start] > array[start2]) {
				tmpAddr[tmpIndex++] = array[start++];
				count = (count + end - start2+1) % 1000000007;//逆序对
			}else {
				tmpAddr[tmpIndex++] = array[start2++];
			}
		}

		if (start2 <= end) {
			System.arraycopy(array, start2, tmpAddr, tmpIndex, end - start2 + 1);
		}
		if (start <= mid) {
			System.arraycopy(array, start, tmpAddr, tmpIndex, mid - start + 1);
		}
		System.arraycopy(tmpAddr, i, array, i, end - i + 1);


	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值