2022-01-20: 矩形区域不超过 K 的最大数值和。 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。 题目数据保证总会存在一
2022-01-20: 矩形区域不超过 K 的最大数值和。
给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。
题目数据保证总会存在一个数值和不超过 k 的矩形区域。
力扣363。
答案2022-01-20:
有序表。前缀和。压缩数组。
代码用golang编写。代码如下:
package main
import (
"fmt"
"math"
"sort"
)
func main() {
matrix := [][]int{{1, 0, 1}, {0, -2, 3}}
k := 2
ret := maxSumSubmatrix(matrix, k)
fmt.Println(ret)
}
func nearK(arr []int, k int) int {
if len(arr) == 0 {
return math.MinInt64
}
//TreeSet<Integer> set = new TreeSet<>();
set := make(map[int]struct{})
//set.add(0);
set[0] = struct{}{}
ans := math.MaxInt64
sum := 0
for i := 0; i < len(arr); i++ {
// 讨论子数组必须以i位置结尾,最接近k的累加和是多少?
sum += arr[i]
// 找之前哪个前缀和 >= sum - k 且最接近
// 有序表中,ceiling(x) 返回>=x且最接近的!
// 有序表中,floor(x) 返回<=x且最接近的!
find, ok := ceiling(set, sum-k)
if ok {
curAns := sum - find
ans = getMax(ans, curAns)
}
set[sum] = struct{}{}
}
return ans
}
func maxSumSubmatrix(matrix [][]int, k int) int {
if len(matrix) == 0 || len(matrix[0]) == 0 {
return 0
}
if len(matrix) > len(matrix[0]) {
matrix = rotate(matrix)
}
row := len(matrix)
col := len(matrix[0])
res := math.MinInt64
sumSet := make(map[int]struct{})
for s := 0; s < row; s++ {
colSum := make([]int, col)
for e := s; e < row; e++ {
// s ~ e 这些行 选的子矩阵必须包含、且只包含s行~e行的数据
// 0 ~ 0 0 ~ 1 0 ~ 2 。。。
// 1 ~ 2 1 ~ 2 1 ~ 3 。。。
sumSet[0] = struct{}{}
rowSum := 0
for c := 0; c < col; c++ {
colSum[c] += matrix[e][c]
rowSum += colSum[c]
it, ok := ceiling(sumSet, rowSum-k)
if ok {
res = getMax(res, rowSum-it)
}
sumSet[rowSum] = struct{}{}
}
//sumSet.clear();
sumSet = make(map[int]struct{})
}
}
return res
}
func rotate(matrix [][]int) [][]int {
N := len(matrix)
M := len(matrix[0])
//int[][] r = new int[M][N];
r := make([][]int, M)
for i := 0; i < M; i++ {
r[i] = make([]int, N)
}
for i := 0; i < N; i++ {
for j := 0; j < M; j++ {
r[j][i] = matrix[i][j]
}
}
return r
}
func getMax(a, b int) int {
if a > b {
return a
} else {
return b
}
}
func ceiling(set map[int]struct{}, v int) (res int, ok bool) {
arr := make([]int, 0)
for k, _ := range set {
arr = append(arr, k)
}
sort.Ints(arr)
index := NearestIndex(arr, v)
if index == -1 {
return
} else {
ok = true
res = arr[index]
return
}
}
// 在arr上,找满足>=value的最左位置
func NearestIndex(arr []int, v int) int {
L := 0
R := len(arr) - 1
index := -1 // 记录最左的对号
for L <= R {
mid := L + (R-L)>>1
if arr[mid] >= v {
index = mid
R = mid - 1
} else {
L = mid + 1
}
}
return index
}
执行结果如下:

2022-01-20: 矩形区域不超过 K 的最大数值和。 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。 题目数据保证总会存在一的更多相关文章
- N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列。设计加密解密算法,且要求K<=15*N.
N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列.设计加密解密算法,且要求K<=15*N. ...
- 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 print-all-combinations-of-given-length
// 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 /* Input: set[] = {'a', 'b'}, k = 3 Output: aaa aab aba ...
- 找出某名珍贵药材的生长区域(ArcPy实现)
一.背景 某种珍贵药材生长于山区,通过研究了解到这种药材生长具有严格的生长条件.为了能更好地保护该药材的生长环境,现在需要使用GIS空间分析方法,将药材适合生长区域找出来,以便为该物种保护提供依据. ...
- 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
// ConsoleApplication2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "stdafx.h ...
- 在行列都排好序的矩阵中找数 【题目】 给定一个有N*M的整型矩阵matrix和一个整数K, matrix的每一行和每一 列都是排好序的。实现一个函数,判断K 是否在matrix中。 例如: 0 1 2 5 2 3 4 7 4 4 4 8 5 7 7 9 如果K为7,返回true;如果K为6,返 回false。 【要求】 时间复杂度为O(N+M),额外空间复杂度为O(1)。
从对角考虑 package my_basic.class_3; /** * 从对角开始 */ public class Code_09_FindNumInSortedMatrix { public s ...
- 海量数据中找出前k大数(topk问题)
海量数据中找出前k大数(topk问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小 ...
- 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些. 先拿10000个数建堆, ...
- 1738. 找出第 K 大的异或坐标值
2021-05-19 LeetCode每日一题 链接:https://leetcode-cn.com/problems/find-kth-largest-xor-coordinate-value/ 标 ...
- 算法试题 - 找出最小 k 个数
题目 题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析 思路1 这一题应用堆排序算法复杂度只有O(nlog k), ...
- 刷题-力扣-1738. 找出第 K 大的异或坐标值
1738. 找出第 K 大的异或坐标值 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-kth-largest-xor-co ...
随机推荐
- Javaweb学习笔记第四弹
JDBC API详解 1.DriverManager作用: 1.注册驱动 registerDriver 2.获取数据库连接 getConnection 参数:1.url jdbc:mysql://lo ...
- opencv筛选轮廓的几种方法总结
在使用opencv处理图像的时候,在获取ROI区域这一步用的最多的就是找到指定区域,一般是根据轮廓提取,我们可以通过opencv中的findContours()函数来查找图片中的轮廓,但是会发现找到的 ...
- EF Core如何使用DbFirst
首先安装好 Microsoft.EntityFrameworkCore.SqlServer [ef 的数据库驱动程序 如果是其他数据库这个要换成对应的数据库驱动] Microsoft.Entity ...
- Condition 接口
系统性学习,移步IT-BLOG Java 对象拥有一组监视方法:wait().wait(long timeout).notify() 以及 notifyAll() 方法,这些方法与 synchroni ...
- 随机服务系统模拟—R实现(二)
M/M/1随机服务系统的模拟 M/M/1模型是一种出生-死亡过程,此随机过程中的每一个状态代表模型中人数的数目.因为模型的队列长度无限且参与人数亦无限,故此状态数目亦为无限.例如状态0表示模型闲置.状 ...
- CentOS安装时钟同步服务
使用chrony用于时间同步 yum install chrony -y vim /etc/chrony.conf cat /etc/chrony.conf | grep -v "^#&qu ...
- 学习关于JavaScript常用的8大设计模式
JavaScript 常用的8大设计模式有 工厂模式:工厂模式是一种创建对象的模式,可以通过一个共同的接口创建不同类型的对象,隐藏了对象的创建过程. 单例模式:单例模式是一种只允许实例化一次的对象模式 ...
- 定时器中断_PWM输出_STM32第三课
1.TIM2中断,需求:实现LED间隔0.5秒闪烁 1.使用CubeMX设置系统时钟.RCC.LED灯.时钟树等基础操作. 2.配置TIMER2,使能为全局变量,设置优先级.并生成代码. 3.代码编写 ...
- RDIFramework.NET Web版报表管理-助力企业高效智能图表
功能描述 在RDIFramework.NET Web版本中全新的报表管理功能模块,非常实用的功能,重量级推荐.主要用于对日常常用的报表做定制展示.可以自动发布到模块(就可授权给指定资源访问),在报表定 ...
- 迁移学习(CLDA)《CLDA: Contrastive Learning for Semi-Supervised Domain Adaptation》
论文信息 论文标题:CLDA: Contrastive Learning for Semi-Supervised Domain Adaptation论文作者:Ankit Singh论文来源:NeurI ...