剑指offer打卡11-数组中的逆序对(java版)
1. 考察知识点
2. 题目
- 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
- 示例:
- 输入:1,2,3,4,5,6,7,0
- 输出:7
- 这七组分别为:(1, 0),(2, 0),(3, 0),(4, 0),(5, 0),(6, 0),(7, 0),
3. 思路
- 可以用暴力循环的方式写,两两比较元素,如果前一位比后一位大则另逆序对的个数加1(这样做可以得到想要的结果,但是运行时间过长导致题目通过不了)
- 利用递归排序的思想
4. 代码实现
- 方法一:
import java.util.ArrayList;
public class Solution {
public String PrintMinNumber(int [] numbers) {
String str = "";
for (int i = 0; i < numbers.length; i++) {
for (int j = i+1; j < numbers.length; j++) {
int a = Integer.valueOf(numbers[i]+""+numbers[j]);
int b = Integer.valueOf(numbers[j]+""+numbers[i]);
if (a > b){
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}
}
}
for (int i = 0; i < numbers.length; i++) {
str = String.valueOf(numbers[i])
}
return str;
}
- 方法二
public class Solution {
int num;
public int InversePairs(int [] array) {
mergeSort(array, 0, array.length-1);
return num;
}
public void mergeSort(int [] array, int left, int right){
int mid = (left + right) / 2;
if(left < right){
mergeSort(array, left, mid);
mergeSort(array, mid+1, right);
merge(array, left, mid, right);
}
}
public void merge(int [] array, int left, int mid, int right){
int[] temp = new int[right-left+1];
int i = left;
int j = mid + 1;
int t = 0;
while(i <= mid && j <= right){
if(array[i] < array[j]){
temp[t++] = array[i++];
}else{
temp[t++] = array[j++];
num = (num + mid - i + 1) % 1000000007;
}
}
while(i <= mid){
temp[t++] = array[i++];
}
while(j <= right){
temp[t++] = array[j++];
}
for (int k=0; k<temp.length; k++){
array[left+k] = temp[k];
}
}
}