[剑指Offer][数组]数组中的逆序对
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。
1 public class Solution { 2 public int InversePairs(int[] array) { 3 if(array.length == 0) { 4 return 0; 5 } 6 int result = 0; 7 for(int i = 0; i < array.length - 1; i ++) { 8 for(int j = i + 1; j < array.length; j ++) { 9 if(array[i] > array[j]) { 10 result ++; 11 } 12 } 13 } 14 return result % 1000000007; 15 } 16 }
1 public class Solution { 2 public int InversePairs(int[] array) { 3 return mergeSort(array, 0, array.length - 1); 4 } 5 6 public int mergeSort(int[] data, int left, int right) { 7 if(left >= right) { 8 return 0; 9 } 10 int inversePairNum = 0; 11 int middle = (left + right) / 2; 12 inversePairNum = (inversePairNum + mergeSort(data, left, middle)) % 1000000007; 13 inversePairNum = (inversePairNum + mergeSort(data, middle + 1, right)) % 1000000007; 14 inversePairNum = (inversePairNum + mergeArray(data, left, middle, right)) % 1000000007; 15 return inversePairNum; 16 } 17 18 public int mergeArray(int[] data, int left, int middle, int right) { 19 int[] temp = new int[right - left + 1]; 20 int pointerOne = left; 21 int pointerTwo = middle + 1; 22 int count = 0; 23 int inversePairNum = 0; 24 for(count = 0; count < temp.length; count ++) { 25 if((pointerOne > middle) || (pointerTwo > right)) { 26 break; 27 } 28 if(data[pointerOne] <= data[pointerTwo]) { 29 temp[count] = data[pointerOne ++]; 30 } 31 else { 32 temp[count] = data[pointerTwo ++]; 33 inversePairNum = (inversePairNum + (middle - pointerOne + 1)) % 1000000007; 34 } 35 } 36 while(pointerOne <= middle) { 37 temp[count ++] = data[pointerOne ++]; 38 } 39 while(pointerTwo <= right) { 40 temp[count ++] = data[pointerTwo ++]; 41 } 42 for(int i = 0; i < count; i ++) { 43 data[left + i] = temp[i]; 44 } 45 return inversePairNum; 46 } 47 }

浙公网安备 33010602011771号