数组中的逆序对
来源:互联网 发布:mac在线是什么意思 编辑:程序博客网 时间:2024/06/10 01:22
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
IDEA
1.首先是暴利算法,即双重遍历数组,累加前数比后数大的个数
2.用归并算法
并排序的主要思想是将整个序列a[ ]分成两部分,分别递归将这两部分排好序之后,再和并为一个有序的序列
对于带合并的两个序列seq1和seq2,seq1中的某个数a[i], eq2中的某个数a[j],如果a[i]<a[j],没有逆序数,如果a[i]>a[j],那么逆序数为seq2中a[j]前边元素的个数(包括a[j]),即j-(mid+1)=j-mid, 这样累加每次递归过程的逆序数,得出总的逆序数
3.树状数组
CODE
2.归并算法
public class Solution { public int InversePairs(int [] array) { if(array.length==0){ return 0; } int count=mergeSort(array,0,array.length-1); return count; } public int mergeSort(int[] array,int l,int r){ if(l==r){ return 0; } int mid=(l+r)/2; int lNum=mergeSort(array,l,mid); int rNum=mergeSort(array,mid+1,r); return (Sort(array,l,mid,r)+lNum+rNum)%1000000007; } public int Sort(int[] array,int l,int mid,int r){ int i=mid,j=r,k=r-l; int temp[]=new int[r-l+1]; int count=0; while(i>=l&&j>=mid+1){ if(array[i]>array[j]){ temp[k--]=array[i--]; count+=(j-mid); count%=1000000007; }else{ temp[k--]=array[j--]; } } while(i>=l){ temp[k--]=array[i--]; } while(j>=mid+1){ temp[k--]=array[j--]; } int p=0; while(l<=r){ array[l++]=temp[p++]; } return count; }}
0 0
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- String的trim()方法无效的解决办法
- DynamicCocoa:滴滴 iOS 动态化方案的诞生与起航
- +-字符串
- sublime格式化代码快捷键+修改tab为4个空格
- 单独使用Quartz 2.1.7 时Job属性Spring无法注入
- 数组中的逆序对
- CSS3动画——Keyframes
- AES DES RSA SHA MD5优缺点
- u-boot之u-boot.bin的生成
- 机器学习算法比较
- 剑指offer--跳台阶(递归问题)
- [python3教程]第三章.3.2迈出第一步
- COM学习笔记(二)
- 二叉树的遍历