lintcode:逆序对
题目
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的总数。
概括:如果a[i] > a[j] 且 i < j, a[i] 和 a[j] 构成一个逆序对。
序列 [2, 4, 1, 3, 5]
中,有 3 个逆序对 (2, 1)
, (4, 1)
, (4, 3)
,则返回 3
。
解题
直接暴力找,时间复杂度O(n^2)
public class Solution {
/**
* @param A an array
* @return total of reverse pairs
*/
public long reversePairs(int[] A) {
// Write your code here
long res = 0;
int n = A.length;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(A[i] >A[j]){
res ++;
}
}
}
return res;
}
}
归并排序的思想
对于数组A[p,...,q]
分成两个数组A[p,...,r],A[r+1,...,q]
当这两个数组都是有序的时候,其逆序对数很好求
可以两个指针i,j分布指向数组的尾部
当A[i]>A[j]时候一定是逆序对,注意是有序的,逆序对数量:j-(r+1) +1 = j-r
else 不是逆序对
程序
public class Solution {
/**
* @param A an array
* @return total of reverse pairs
*/
long res = 0;
public long reversePairs(int[] A) {
// Write your code here int n = A.length;
reversP(A,0,n-1);
return res;
}
public void reversP(int[] A,int low,int high){
if(low>=high)
return;
int mid = low + (high - low)/2;
reversP(A,low,mid);
reversP(A,mid+1,high);
merge(A,low,mid,high);
}
public void merge(int[] A,int low ,int mid ,int high){
int len = high - low + 1;
int[] C = new int[len]; // 临时存放中间归并数组
int i = mid;
int j = high;
int k = len -1;
while(i>= low && j>=mid+1){
if(A[i] > A[j]){
C[k--] = A[i];
i--;
res += j - (mid + 1) +1; // 逆序对数量
}else{
C[k--] = A[j];
j--;
}
}
while(i>=low){
C[k--] = A[i];
i--;
}
while(j>=mid+1){
C[k--] = A[j];
j--;
} for(k=0;k<len;k++){
A[k+low] = C[k];
} }
public void print(int[] A){
for(int a:A){
System.out.print(a+"\t");
}
System.out.println();
}
}
分析下输出过程
测试样例:[2,4,1,3,5]
5个元素划分的区间
元素下标上界是4
[0,4]划分[0,2]、[3,4]
---[0,2]划分:[0,1]、[2]
-------[0,1]划分:[0]、[1]
---[3,4]划分:[3]、[4]
输出情况
2 4 1 3 5 最底层只有一个元素
1 2 4 3 5 [0,2]合并
1 2 4 3 5
1 2 3 4 5 [0,4]合并
算法可行性
一个数组分成B、C两部分,B、C两部分分布升序排序
对于A[i] 在B中,A[j]在C中的情况,关于A[i]与A[j]的逆序对数量与B中A[i]的位置、C中A[j]的位置无关,这个很显然
程序开始的时候找到是1个元素,后来合并成两个元素的数组,这样慢慢的合并,并计算逆序对的数量,最后就得到答案了
lintcode:逆序对的更多相关文章
- 【CQOI2011】动态逆序对 BZOJ3295
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- CH Round #72 奇数码问题[逆序对 观察]
描述 你一定玩过八数码游戏,它实际上是在一个3*3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3*3的网格中. 例如:5 2 81 3 _4 6 7 在游戏过程中,可以把空格与其上 ...
- POJ3928Ping pong[树状数组 仿逆序对]
Ping pong Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3109 Accepted: 1148 Descrip ...
- NOIP2013火柴排队[逆序对]
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- bzoj 3295 动态逆序对 CDQ分支
容易看出ans[i]=ans[i-1]-q[i],q[i]为删去第i个数减少的逆序对. 先用树状数组算出最开始的逆序对,预处理出每个数前边比它大的和后边比它小的,就求出了q[i]的初始值. 设b[i] ...
- 诸城模拟赛 dvd的逆序对
[题目描述] dvd是一个爱序列的孩子. 他对序列的热爱以至于他每天都在和序列度过 但是有一个问题他却一直没能解决 给你n,k求1~n有多少排列有恰好k个逆序对 [输入格式] 一行两个整数n,k [输 ...
- 归并求逆序数(逆序对数) && 线段树求逆序数
Brainman Time Limit: 1000 MS Memory Limit: 30000 KB 64-bit integer IO format: %I64d , %I64u Java c ...
- BZOJ 3295: [Cqoi2011]动态逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3865 Solved: 1298[Submit][Sta ...
- BZOJ 3295 【Cqoi2011】 动态逆序对
Description 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n\)的一个排列,按照某种顺序依 ...
随机推荐
- simplexml_load_string 解析gb2312编码的xml
<?php header('Content-type:text/html;charset=UTF-8'); $url = 'http://www.xxx.com/text.xml'; $cont ...
- SQL-Server数据库学习笔记-表
1. 表及其属性 表(Table):也称实体,是存储同类型数据的集合. 列(Field):也称字段.域或属性,它构成表的架构,具体表示为一条信息中的一个属性. 行(Row):也称元组(Tuple),存 ...
- params关键字
每个C#函数都允许有个参数带params关键字,在调用的时候可以不给他传值,也可以给他传值,还可以给他传多个值 注意事项: ·一个函数中只能一个参数带params关键字:·带params关键字的参数必 ...
- My First Django Project (2)
1. 接下来是比较重要的VIEWS.py,您将会比较多的时间在这.有点想.net里面的aspx的cs概念,而aspx就是和接下来要创建的template html相似! 下面是我创建的一个view d ...
- Android -- 倒计时的实现
CountDownTimer CountDownTimer这个 ...
- 20145120 《Java程序设计》第7周学习总结
20145120 <Java程序设计>第7周学习总结 教材学习内容总结 Lambda表达式 例:Comparator<String> byLength = (name1, na ...
- 四则运算之C++版
一.设计思想 之前的版本是用Java语言实现的,在这次的练习中,我用C++语言将其功能逐一实现,其实C++与Java有很多相似之处,只是一些书写格式不同,思路还是一样的. 二.源代码 #include ...
- 寻找“水王”--c++
一.题目与设计思路 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一 ...
- Java基础学习总结--Java对象的序列化和反序列化
一.序列化和反序列化的概念 把对象转换成字节序列的过程称之为对象的序列化 把字节序列恢复为对象的过程称之为对象的反序列化 对象序列化的主要用途: 1)把对象的字节序列永久的保存到硬盘上,通常放在一个文 ...
- pxe+preseed安装配置
Ubuntu Server 部署手册 pxe+tftp+vsftp+apache2 ========================================================== ...