j

jaryue

V1

2023/04/28阅读:11主题:默认主题

leetcode 598. 范围求和 II

leetcode 598. 范围求和 II


题目描述

  1. 范围求和 II

给你一个 m x n 的矩阵 M ,初始化时所有的 0 和一个操作数组 op ,其中 ops[i] = [ai, bi] 意味着当所有的 0 <= x < ai 和 0 <= y < bi 时, M[x][y] 应该加 1。

在 执行完所有操作后 ,计算并返回 矩阵中最大整数的个数 。

示例 1:

输入: m = 3, n = 3,ops = [[2,2],[3,3]] 输出: 4 解释: M 中最大的整数是 2, 而且 M 中有4个值为2的元素。因此返回 4。 示例 2:

输入: m = 3, n = 3, ops = [[2,2],[3,3],[3,3],[3,3],[2,2],[3,3],[3,3],[3,3],[2,2],[3,3],[3,3],[3,3]] 输出: 4 示例 3:

输入: m = 3, n = 3, ops = [] 输出: 9

提示:

1 <= m, n <= 4 * 104 0 <= ops.length <= 104 ops[i].length == 2 1 <= ai <= m 1 <= bi <= n

解题思路

法1

模拟:横向最小值与纵向最小值\

由题意可知我们需要得到横纵坐标相乘最小的值,但是我们必须考虑到交叉的情况

例如:3;3[1,2][2,1]

结果:

2,1,0

1,0,0

0,0,0

最大值为2,只有一个,所以应该输出1

  • 时间复杂度(O(n))
  • 空间复杂度(O(1))

执行结果

法1

func maxCount(m int, n int, ops [][]int) int {
 if len(ops) == 0 {
  return m * n
 }
 l1, l2 := ops[0][0], ops[0][1]
 for i := 1; i < len(ops); i++ {
  if ops[i][0] < l1 {//横坐标最小值
   l1 = ops[i][0]
  }
  if ops[i][1] < l2 {//纵坐标最小值
   l2 = ops[i][1]
  }
 }
 return l1 * l2
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 4 ms , 在所有 Go 提交中击败了 94.64% 的用户 内存消耗: 3.6 MB , 在所有 Go 提交中击败了 89.29% 的用户 通过测试用例: 69 / 69 炫耀一下:

法2


法3


分类:

后端

标签:

后端

作者介绍

j
jaryue
V1