六数组中的逆序对
Posted 思想累积
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了六数组中的逆序对相关的知识,希望对你有一定的参考价值。
题目:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
代码实现:
方法一:
暴力解法(没啥说的很简单,嗯,超时了。。)
class Solution
public static int reversePairs(int[] nums)
int n = 0;
for(int i = 0; i < nums.length - 1; i ++)
for(int j = i; j < nums.length; j ++)
if(nums[i] > nums[j])
n++;
return n;
方法二:
使用归并排序
class Solution
public static int reversePairs(int[] nums)
if (nums == null || nums.length < 2)
return 0;
return mergeSort(nums, 0, nums.length - 1);
public static int mergeSort(int[] nums, int left, int right)
if (left >= right) // left 小于 right 才能继续下去
return 0;
int mid = (left + right) / 2; // 找到中间位置
return mergeSort(nums, left, mid) // 向左递归
+ mergeSort(nums, mid + 1, right) // 向右递归
+ merge(nums, left, mid, right); // 合并
public static int merge(int[] arr, int left, int mid, int right)
int i = left; // 左边指针
int j = mid + 1; // 右边指针
int k = 0; // 临时数组指针
int n = 0; // 计数
int[] temp = new int[right - left + 1]; // 临时数组
while (i <= mid && j <= right) // 循环条件左边指针小于中间,右边小于最右边指针
if (arr[i] > arr[j]) // 如果arr[i] > arr[j]的话
temp[k++] = arr[j++]; // arr[j]赋值到temp数组中
n += mid -i + 1; // 数组是有序的,arr[i] 后面元素不超过 mid 位置的元素都比 arr[j] 大
else
temp[k++] = arr[i++];
while (i <= mid)
temp[k++] = arr[i++];
while (j <= right)
temp[k++] = arr[j++];
// 循环给原来的数组赋值
// 例如 int[] arr = 7, 5, 6, 4; 经过三次 merge,5, 7 4, 6 4, 5, 6, 7
for (int l = 0; l < temp.length; l ++)
arr[left + l] = temp [l];
return n;
以上是关于六数组中的逆序对的主要内容,如果未能解决你的问题,请参考以下文章