leetcode:面试题51. 数组中的逆序对(归并,回溯)

题目:

在这里插入图片描述

分析:

课上讲过,归并算法思路。

代码:

int all=0;
void mergesort(vector<int> &n,i,j)
{
 if(i==j)
 {
  return;
 }
 if(i+1==j){
  if(n[i]>n[j])
  {
   all++;
   int c=n[i];n[i]=n[j];n[j]=c;
  }
  return;
 }
 mergesort(n,i,(i+j)/2);
 mergesort(n,(i+j)/2+1,j);
 //先看逆序对个数
 int c=(i+j)/2+1;
 for(int k=i;k<=(i+j)/2;k++)
 {
  if(c==j+1) all+=j-(i+j)/2;
  else{
   for(;c<=j;c++)
   {
    if(n[c]>=n[k]) break;
   }
   all+=c-(i+j)/2-1;
  }
 }
 if(n[(i+j)/2]<=n[(i+j)/2+1]) return;
 vector<int> A(j-i+1,0);
 int c1=i,c2=(i+j)/2+1;
 for(int k=0;k<j-i+1;k++)
 {
  if(c1==(i+j)/2+1)
  {
   A[k]=n[c2];
   c2++;
   continue;
  }
  if(c2==j+1)
  {
   A[k]=n[c1];
   c1++;
   continue;
  }
  if(n[c1]>n[c2])
  {
   A[k]=n[c2];c2++;
   }
  else
  {
   A[k]=n[c1];c1++;
   }  
 }
 for(int k=0;k<j-i+1;k++)
 {
  n[i+k]=A[k];
 }
}
原创文章 397 获赞 284 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/105725006