給定一個數組 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我們就將 (i, j) 稱作一個重要翻轉對。
你需要返回給定數組中的重要翻轉對的數量。
示例 1:
輸入: [1,3,2,3,1]
輸出: 2
代碼
class Solution {public int reversePairs(int[] nums) {return getReversePairs(nums,0,nums.length-1);}public int getReversePairs(int[] nums,int l,int r) {if(l>=r) return 0;int mid=(l+r)/2;int ret=getReversePairs(nums, l, mid)+getReversePairs(nums, mid+1, r);//將左右數組排序,并統計結果int i=l,j=mid+1;while (i<=mid)//統計左右數組的反轉對{while (j<=r&&(long)nums[i]>2*(long)nums[j])j++;ret+=j-mid-1;i++;}int []temp=new int[r-l+1];int p=0,p1=l,p2=mid+1;while (p1<=mid||p2<=r)//歸并{if(p1>mid)temp[p++]=nums[p2++];else if(p2>r)temp[p++]=nums[p1++];else if(nums[p1]>=nums[p2])temp[p++]=nums[p2++];else temp[p++]=nums[p1++];}for(int k=0;k<temp.length;k++) nums[l+k]=temp[k];//寫回原來數組return ret;}
}