2022-04-17:给定一个数组arr,其中的值有可能正、负、0, 给定一个正数k。 返回累加和>=k的所有子数组中,最短的子数组长度。 来自字节跳动。力扣862。
2022-04-17:给定一个数组arr,其中的值有可能正、负、0,
给定一个正数k。
返回累加和>=k的所有子数组中,最短的子数组长度。
来自字节跳动。力扣862。
答案2022-04-17:
看到子数组,联想到结尾怎么样,开头怎么样。
预处理前缀和,单调栈。
达标的前缀和,哪一个离k最近?
单调栈+二分。复杂度是O(N*logN)。
双端队列。
时间复杂度:O(N)。
代码用rust编写。代码如下:
fn main() {
let arr: Vec<isize> = vec![2, -1, 2];
let K: isize = 3;
let ret = shortest_subarray2(arr, K);
println!("{}", ret);
}
const MAXVALUE: isize = 9223372036854775807;
fn shortest_subarray2(arr: Vec<isize>, K: isize) -> isize {
let N = arr.len();
let mut sum: Vec<isize> = vec![];
for i in 0..N + 1 {
sum.push(0);
}
for i in 0..N {
sum[i + 1] = sum[i] + arr[i];
}
let mut ans: isize = MAXVALUE;
let mut dq: Vec<isize> = vec![];
for i in 0..N + 1 {
dq.push(0);
}
let mut l: isize = 0;
let mut r: isize = 0;
for i in 0..N + 1 {
// 头部开始,符合条件的,从头部弹出!
while l != r && sum[i] - sum[dq[l as usize] as usize] >= K {
ans = get_min(ans, i as isize - dq[l as usize]);
l += 1;
}
// 尾部开始,前缀和比当前的前缀和大于等于的,从尾部弹出!
while l != r && sum[dq[(r - 1) as usize] as usize] >= sum[i as usize] {
r -= 1;
}
dq[r as usize] = i as isize;
r += 1;
}
if ans != MAXVALUE {
ans
} else {
-1
}
}
fn get_min(a: isize, b: isize) -> isize {
if a < b {
a
} else {
b
}
}
执行结果如下:
公众号:福大大架构师每日一题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
2021-04-17 2021-04-17:给定一个整型数组 arr,数组中的每个值都为正数,表示完成一幅画作需要的时间,再 给定 一个整数 num,表示画匠的数量,每个画匠只能画连在一起的画作。所有的画家 并行工作,请