打卡系列-剑指 Offer 51. 数组中的逆序对(困难)
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4] 输出: 5
限制:
0 <= 数组长度 <= 50000
解析:
public static int reversePairs(int[] nums) { int[] temps = new int[nums.length]; int count = reversePairs(nums , 0 , nums.length - 1 , temps); return count; } //分治计算 public static int reversePairs(int[] nums , int start , int end , int[] temps){ if(start >= end){ return 0; } int mid = start + (end - start)/2; //左半边逆序对 int left = reversePairs(nums , start , mid , temps); //右半边逆序对 int right = reversePairs(nums , mid+1 , end , temps); //左边排序好与右边排序好的数,计算逆序对 int count = 0; int r = mid + 1; int l = start; int index = start; while(l <= mid && r <= end){ if(nums[l] > nums[r]){ temps[index] = nums[r]; count += mid - l + 1; r++; }else { temps[index] = nums[l]; l++; } index++; } //左边还剩的数 while (l <= mid){ temps[index++] = nums[l++]; } //右边还剩的数 while (r <= end){ temps[index++] = nums[r++]; } for(;start <= end ; start++){ nums[start] = temps[start]; } return left + right + count; }
leetcode
分治思想
上一篇:
IDEA上Java项目控制台中文乱码