https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/
这个题最简单的解法就是直接双循环遍历数组,然后统计后者小于前者的对数。但是很明显这个O(N^2)的算法这里会T。
然后我看了题解才发现这个题他们使用归并排序来解题,真的是万万没想到啊。
官方解析已经很清晰了,而且还配有视频,这里就不说自己的理解了。
这个题主要还是帮我复习了一下归并排序的实现,有些东西久了不用就容易生疏。
class Solution { int res = 0; public int reversePairs(int[] nums) { if(nums == null || nums.length == 0){ return 0; } int[] newNums = Arrays.copyOfRange(nums,0,nums.length); mergeSort(newNums,0,newNums.length-1); return res; } private void mergeSort(int[] nums, int l, int r){ if(l >= r){ return; } int mid = l + (r-l) / 2; mergeSort(nums,l,mid); mergeSort(nums, mid+1, r); merge(nums,l,mid,r); } private void merge(int[] nums,int start, int mid, int end){ int i = start, j = mid+1; int k = 0; int[] temp = new int[end - start +1]; while(i <= mid && j <= end){ if(nums[i] <= nums[j]){ temp[k++] = nums[i]; i++; }else { temp[k++] = nums[j]; res += (mid-i+1); j++; } } while(i <= mid){ temp[k++] = nums[i]; i++; } while(j <= end){ temp[k++] = nums[j]; j++; } if (temp.length >= 0) System.arraycopy(temp, 0, nums, start, temp.length); } }