java归并排序实现,java面试排序算法
如何解决写爬虫IP受阻的问题?立即使用。
文章背景:
复习算法和数据结构的时候,发现了面试笔试题。让我们看看下面的问题:
(学习视频分享:java教学视频)
数组中的两个数字。如果前一个数字大于后一个数字,则这两个数字以相反的顺序形成一对。进入一个数组,找出这个数组中逆序排列的对的总数p。并且将模p的结果输出到1000000007。输出P00000007.
输入描述:
确保输入数组中没有相同的数字。
数据范围:
对于size=10^4的数据
size=10^5大学的数据
对于0的数据,大小=2 * 10 ^ 5
分析:
这个问题很容易直接求解,但是时间复杂度是o(n*n)。一开始我想都没想就得到这个问题,直接用dp完成了。然后,我发现直接解dp比较好,因为都是o(n*n)的复杂度,dp也占用2 * 10 ^ 5的空间。下面是直接解和dp,都超时了。
(更多相关面试问题推荐:java面试问答)
代码共享:
//直接找到方法,超时
公共类解决方案{
公共静态int sum
public static int inverse pairs(int[]array){
dp(数组);
返回总和;
}
公共静态void dp(int []array){
for(int I=array . length-1;I 0;我- ){
for(int j=I-1;j=0;j - ){
if(array[j] array[i]){
sum=1;
}
}
sum %=1000000007
}
}
}公共类解决方案{
//一维数组dp
公共静态int sum
public static int inverse pairs(int[]array){
dp(数组);
返回总和;
}
public static int count[]=new int[200004];
公共静态void dp(int []array){
for(int I=array . length-1;I 0;我- ){
for(int j=I-1;j=0;j - ){
if(array[j] array[i]){
count[j]=count[j 1]1;
}否则{
count[j]=count[j 1];
}
}
sum=count[0];
sum %=1000000007
for(int k=0;k数组. length;k)
count[k]=0;
}
}
}dp这里是多余的,
下面是解决问题的归并排序。如果不知道合并排序,可以看看我之前的博客合并排序:
公共类解决方案{
//合并排序AC
公共静态int cnt
public static int inverse pairs(int[]array){
if(数组!=null){
RecusionSorted(array,0,array . length-1);
}
归还cnt00000007;
}
public static void MegerArray(int[]data,int start,int mid,int end) {
int temp[]=new int[end-start 1];
int i=mid
int j=end
int m=mid 1;
int z=0;
while(j=m i=start) {
if(data[i] data[j]) {
temp[z]=data[I-];
CNT=(j-mid)00000007;
cnt %=1000000007
}否则{
temp[z]=data[j-];
}
}
while(j=m) {
temp[z]=data[j-];
}
while(i=start) {
temp[z]=data[I-];
}
for(int k=start;k=结束;k ) {
data[k]=temp[end-k];
}
}
public static void recusion sorted(int data[],int start,int end ) {
如果(开始结束){
int mid=(start end)1;
RecusionSorted(数据、开始、中期);
RecusionSorted(data,mid 1,end);
MegerArray(数据,开始,中间,结束);
}
}
}相关推荐:java入门教程以上是java面试中合并和排序应用的详细内容。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。