技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完。

目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有限,其他语言的实现有兴趣的朋友请自己尝试。

初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式聊到大数据框架,从大数据聊到人工智能,... ...。

如果有任何问题可以在文章后评论或者私信给我

我会持续分享下去,敬请您的关注。

LeetCode 598. 范围求和 II(Range Addition II)

问题描述:

给定一个初始元素全部为 0,大小为 m*n 的矩阵 M 以及在 M 上的一系列更新操作。

操作用二维数组表示,其中的每个操作用一个含有两个正整数 a 和 b 的数组表示,含义是将所有符合 0 <= i < a 以及 0 <= j < b 的元素 M[i][j] 的值都增加 1。

在执行给定的一系列操作后,你需要返回矩阵中含有最大整数的元素个数。

注:

  1. m 和 n 的范围是 [1,40000]。
  2. a 的范围是 [1,m],b 的范围是 [1,n]。
  3. 操作数目不超过 10000。

示例:




python矩阵求最小值的索引_最小值


C语言实现:

Ops中的每一个数组就是一个操作,我们可以把每一个数组看成一个矩阵,我们可以将所有的这些矩阵(操作)叠加在矩阵M上,注意操作都是从M的左上角,即M[0,0]开始的。每叠加一层M上面被覆盖的元素就加1。

这里举个例子,如下图:


python矩阵求最小值的索引_最小值_02


例子中,M是一个4X5的矩阵,操作的矩阵分别是2X3,3X5,4X2最后我们会发现,三个操作矩阵重叠的地方覆盖的元素,被加的次数最多,也就是我们要要的结果,所以我们只要求重叠部分的和列值的乘积即可

又因为操作都是从M[0,0]开始的,所以就转换成了,求所有操作矩阵行的最小值和列的最小值的乘积。

因此我们很容易得出如下代码:


python矩阵求最小值的索引_python矩阵求最小值的索引_03


python矩阵求最小值的索引_数组_04


Java语言的实现:

Java 的实现和C语言的实现基本一致,不再撰述。

代码如下:


python矩阵求最小值的索引_python矩阵求最小值的索引_05


python矩阵求最小值的索引_二维数组求最小值_06


python语言的实现:

我们可以将ops理解为一个len(ops)X2的二维矩阵,我们要的结果就是对ops进行转置变成对应的2Xlen(ops)的矩阵,然后求每一行的最小值,zip很适合做这个事情。

代码如下:


python矩阵求最小值的索引_最小值_07


python矩阵求最小值的索引_数组_08