JZ-035-陣列中的逆序對
阿新 • • 發佈:2021-12-24
陣列中的逆序對
題目描述
在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007
題目連結: 陣列中的逆序對
程式碼
/** * 標題:陣列中的逆序對 * 題目描述 * 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007 * 題目連結: * https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&&tqId=11188&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking */ public class Jz35 { private long cnt = 0; private int[] tmp; // 在這裡宣告輔助陣列,而不是在 merge() 遞迴函式中宣告 public int inversePairs(int[] array) { tmp = new int[array.length]; mergeSort(array, 0, array.length - 1); return (int) (cnt % 1000000007); } private void mergeSort(int[] nums, int l, int h) { if (h - l < 1) { return; } int m = l + (h - l) / 2; 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) { tmp[k] = nums[j++]; } else if (j > h) { tmp[k] = nums[i++]; } else if (nums[i] <= nums[j]) { tmp[k] = nums[i++]; } else { tmp[k] = nums[j++]; this.cnt += m - i + 1; // nums[i] > nums[j],說明 nums[j..mid] 都大於 nums[j] } k++; } for (k = l; k <= h; k++) { nums[k] = tmp[k]; } } public static void main(String[] args) { } }
【每日寄語】 每一天都是全新的開始,每一天都會有最好的運氣。