面试题51. 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
在归并排序中进行处理:
class Solution { private int count; private int[] temp; public int reversePairs(int[] nums) { if(nums == null || nums.length == 0) return 0; temp = new int[nums.length]; mergeSort(nums,0,nums.length - 1); return count; } private void mergeSort(int[] nums,int l,int h){ if(l >= h) return; int m = (h - l) / 2 + l; mergeSort(nums,l,m); mergeSort(nums,m + 1,h); merge(nums,l,m,h); } private void merge(int[] nums,int l,int m,int h){ int i = l,j = m + 1,k = l; while(i <= m || j <= h){ if(i > m){ temp[k++] = nums[j++]; }else if(j > h){ temp[k++] = nums[i++]; }else if(nums[i] <= nums[j]){ temp[k++] = nums[i++]; }else{ temp[k++] = nums[j++]; count += m - i + 1; } } for(int p = l;p <= h;p++){ nums[p] = temp[p]; } } }