LeetCode归并排序之笔试全覆盖(一)

前景回顾:

在系列(一)部分我们已经大概了解了什么事链表,以及完成了链表在LeetCode的一些经典的题目,比如两个链表相交点问题.合并两个有序链表,合并K个有序链表,链表相加问题.

没看过系列(一)的请先看一.icon-default.png?t=N7T8https://blog.csdn.net/weixin_56522854/article/details/134894925?spm=1001.2014.3001.5501那么我们现在继续的完成LeetCode上和面试常考的题目. 先来一道在快手经常考的题目 但是在leetcode上没有的题目 就是大家可能会听到的

归并排序小和问题

分析:只是这个问题 我们从数组去进行解决操作. 先理解一下题目的意思 就是给你一个数组  要求的是在数组元素的左侧是否有比当前元素小的数 有的话 就把这些数进行相加起来 然后再把所有的小和的值全部加起来 这就是这个题.

什么是归并排序?很简单的理解归并排序简单的来说 就是进行分治的操作 先对一个大的数组进行分成小的数组 并且是这个小的数组变成是有序的数组 再进行合并的操作 让两个小的数组变成一个大的数组的操作 也就是我们经常所说的mereg操作  总结一句:归并排序就是先把左半边数组排序好,在把右半边数组排序好,然后把两变数组合并.

题解:那么这道题和归并有什么关系呢 看下面的例子 比如给了一个数组[4,2,1,3,0,6,3,9]这样子的数组 我们使用归并排序① 第一步就是将这个大的数组分割成两个小的数组 我们就把这个两个数组分别叫成 左数组 [4,2,1,3]和 右数组[0,6,3,9] 这个时候我们还要继续分下去 也就是变成左数组[4,2] 右数组[1,3]  另一边 左数组[0,6] 右数组[3,9]  接下来我们又发现还可以继续分下去左数组[4]和右数组[2]  另一边 左数组[1]和右数组[3]  另一边左[0] 右[6]  还有[3]和[9]  好了  ②第二步 我们就要进行meereg操作了 在我们mereg的时候 我们就要知道的是谁小 谁先进行拷贝到上一层的数组上去的操作  这样子我们可以发现在进行排序成有序数组的时候 当发现左组比右组小的时候 我们就知道 该元素是有小和存在的. 那么有几个呢? 当然就是R-P2+1个元素. 具体看下图 画图解析:

那么就这样子我们就可以知道在归并排序的模版下 就可以进行操作. 我们直接上coding

public static int process(int[] arr , int  l ,int r){
    if(l==r){
        return 0;
    }
    
    int mid = l+(r-l)/2;
    
    return process(arr,l,mid)+process(arr,mid+1,r)+merge(arr,l,mid,r);
}
public static int merge(int[] arr , int  l ,int mid , int r){
     //想要合并两个有序数组 我们采用的是 使用一个辅助数组进行存储的操作
       int[] help = new inr[r-l+1];//或者是arr.length
       int i = 0;
       int p1 = l;
       int p2 = m+1;
       int res = 0;//用于存储最后的小和

//这一步就是进行求取小和的操作
      while(p1<=m && p2<=r){
        res += arr[p1]<arr[p2] ? arr[p1]*(r-p2+1):0
        help[i++] = arr[p1]<arr[p2] ? arr[p1++]:arr[p2++];
      }
//接下来就是我们的模版 进行mereg操作 记住是模版
      while(p1<=m){
        help[i++] = arr[p1++];
      }
      while(p2<=r){
        help[i++] = arr[p2++];
      }
     for(i = 0;i<hele.length;i++){
        arr[l+i] = help[i++];
     }
    
      return res;
        

}

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值