剑指Offer打卡day42—— AcWing 65. 数组中的逆序对
Posted Johnny*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer打卡day42—— AcWing 65. 数组中的逆序对相关的知识,希望对你有一定的参考价值。
【题目描述】
AcWing 65. 数组中的逆序对
【思路】
归并排序 每次divide划分问题 在conquer的时候统计逆序对的个数
class Solution {
int nums[];
int ans;
/*
0 1 2 3 4 5 6
1 2 3 4 5 6 0
[0:3] [4: 6]
1 2 3 4
5 6 0
[5 6] --> [5] [6]
[0]
-->
*/
//划分问题
public void divide(int l, int r){
if( l >= r ) return;
int mid = l + r >> 1;
divide(l, mid);
divide(mid + 1, r);
conquer(l, mid, r);
}
//求解逆序对
public void conquer(int l, int m, int r){
int k = 0;
int tmp[] = new int[ r - l + 1];
int i = l, j = m + 1;
while( i <= m && j <= r){
if( nums[i] <= nums[j]){
tmp[k ++] = nums[i ++];
}else{
//出现逆序对
ans += m - i + 1;
tmp[k ++] = nums[j ++];
}
}
while( i <= m ) tmp[k ++] = nums[i ++];
while( j <= r) tmp[k ++] = nums[j ++];
//复制排序好的数组到原数组
int a = l, b = 0;
while( a <= r){
nums[a ++] = tmp[b ++];
}
}
public int inversePairs(int[] _nums) {
if( _nums == null || _nums.length <= 1) return 0;
nums =_nums;
divide(0, nums.length - 1);
return ans;
}
}
以上是关于剑指Offer打卡day42—— AcWing 65. 数组中的逆序对的主要内容,如果未能解决你的问题,请参考以下文章
剑指Offer打卡day42——AcWing 77. 翻转单词顺序
剑指Offer打卡day42—— ACWing 81. 扑克牌的顺子
剑指Offer打卡day39 —— Acwing 42. 栈的压入弹出序列