2024-10-30:或值至少 K 的最短子数组 I。用go语言,给定一个非负整数数组 nums 和一个整数 k,我们需要判断数组中是否存在一个最短的非空子数组,使得该子数组所有元素的按位或(OR)运
2024-10-30:或值至少 K 的最短子数组 I。用go语言,给定一个非负整数数组 nums 和一个整数 k,我们需要判断数组中是否存在一个最短的非空子数组,使得该子数组所有元素的按位或(OR)运算结果至少为 k。如果找到了这样的子数组,返回其长度;如果不存在,则返回 -1。
输入:nums = [1,2,3], k = 2。
输出:1。
解释:
子数组 [3] 的按位 OR 值为 3 ,所以我们返回 1 。
注意,[2] 也是一个特别子数组。
答案2024-10-30:
题目来自leetcode3095。
大体步骤如下:
代码逻辑分析
1.初始化:
minLen被设置为math.MaxInt32,用于存储找到的最短子数组的长度。n是数组nums的长度。
2.解决方案 1:
对于每一个索引
i从0到n-1,表示当前子数组的结束位置。对于每一个
j从i递减到0,表示当前子数组的起始位置。检查从
j到i这段子数组的按位或结果,调用isSpecial函数。如果返回的结果满足大于等于
k,则更新minLen为当前子数组长度i-j+1的最小值。最后,如果没有找到满足条件的子数组,返回
-1;否则返回minLen。
3.isSpecial 函数:
接受数组
nums和子数组的起始、结束索引j、i,以及目标值k。初始化结果
res为0。遍历子数组,计算位或结果
res |= nums[idx]。最后返回一个布尔值,判断
res是否大于等于k。
4.解决方案 2:
该方法做了优化,先检查当前元素
nums[i]是否已经大于等于k,如果是,则直接返回1,因为单独的元素就满足了条件。同样遍历
j,更新nums[j]为nums[j] | nums[i]。并检查是否满足按位或条件。如果找到了满足条件的子数组,则更新
minLen。最后根据
minLen的最终值返回结果。
时间复杂度
解决方案 1:最坏情况下,外层循环和内层循环都是进行
O(n^2)的遍历。解决方案 2:外层循环为
O(n),内层循环的最坏情况下为O(n),因此在某些情况下也可能达到O(n^2)的复杂度。最终时间复杂度:最坏情况为
O(n^2)。
空间复杂度
两种解决方案都只使用了常量级的额外空间,主要是用于存储变量
minLen和中间结果res,以及输入数组nums本身。没有使用额外的数据结构来增加空间开销。最终空间复杂度:
O(1)。
总结
代码通过两种方式实现了目标,虽然最坏情况下时间复杂度达到 O(n^2) 但在实际操作中,尤其是对于较小的输入数组,可能表现良好。空间复杂度保持在常数级别,确保了算法的高效性。
Go完整代码如下:
package main
import (
"fmt"
"math"
)
func minimumSubarrayLength(nums []int, k int) int {
minLen := math.MaxInt32
n := len(nums)
// 解决方案 1 的实现
for i := 0; i < n; i++ {
for j := i; j >= 0; j-- {
if isSpecial(nums, j, i, k) {
minLen = min(minLen, i-j+1)
}
}
}
if minLen == math.MaxInt32 {
return -1
}
return minLen
}
func isSpecial(nums []int, j int, i int, k int) bool {
res := 0
for idx := j; idx <= i; idx++ {
res |= nums[idx]
}
return res >= k
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
// 解决方案 2 的实现
func minimumSubarrayLengthOptimized(nums []int, k int) int {
minLen := math.MaxInt32
n := len(nums)
for i := 0; i < n; i++ {
if nums[i] >= k {
return 1
}
for j := i - 1; j >= 0 && (nums[i]|nums[j]) != nums[j]; j-- {
nums[j] |= nums[i]
if nums[j] >= k {
minLen = min(minLen, i-j+1)
}
}
}
if minLen == math.MaxInt32 {
return -1
}
return minLen
}
func main() {
nums := []int{1, 2, 3}
k := 2
fmt.Println(minimumSubarrayLength(nums, k))
fmt.Println(minimumSubarrayLengthOptimized(nums, k))
}

Rust完整代码如下:
use std::cmp;
fn minimum_subarray_length(nums: Vec<i32>, k: i32) -> i32 {
let mut min_len = i32::MAX;
let n = nums.len();
// 解决方案 1 的实现
for i in 0..n {
for j in (0..=i).rev() {
if is_special(&nums, j, i, k) {
min_len = cmp::min(min_len, (i - j + 1) as i32);
}
}
}
if min_len == i32::MAX {
-1
} else {
min_len
}
}
fn is_special(nums: &Vec<i32>, j: usize, i: usize, k: i32) -> bool {
let mut res = 0;
for idx in j..=i {
res |= nums[idx];
}
res >= k
}
fn minimum_subarray_length_optimized(nums: Vec<i32>, k: i32) -> i32 {
let mut min_len = i32::MAX;
let mut nums = nums.clone(); // 复制一份 nums
let n = nums.len();
for i in 0..n {
if nums[i] >= k {
return 1;
}
for j in (0..i).rev() {
if (nums[i] | nums[j]) != nums[j] {
nums[j] |= nums[i];
if nums[j] >= k {
min_len = cmp::min(min_len, (i - j + 1) as i32);
}
} else {
break; // 提高效率,如果不再变化,则可直接跳出
}
}
}
if min_len == i32::MAX {
-1
} else {
min_len
}
}
fn main() {
let nums = vec![1, 2, 3];
let k = 2;
println!("{}", minimum_subarray_length(nums.clone(), k)); // 解决方案 1
println!("{}", minimum_subarray_length_optimized(nums, k)); // 解决方案 2
}

2024-10-30:或值至少 K 的最短子数组 I。用go语言,给定一个非负整数数组 nums 和一个整数 k,我们需要判断数组中是否存在一个最短的非空子数组,使得该子数组所有元素的按位或(OR)运的更多相关文章
- 用 C# 如何判断数据库中是否存在一个值
选定一个列,比如用户编号列 //欲插入的用户编号string ll_userID="xxxxxxxx"; //查询此编号是否存在SqlCommand mycmd = new Sql ...
- [Swift]LeetCode862. 和至少为 K 的最短子数组 | Shortest Subarray with Sum at Least K
Return the length of the shortest, non-empty, contiguous subarray of A with sum at least K. If there ...
- 和至少为K的最短子数组
返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 1: 输入:A = [1], K = 1 输出:1 示例 2: 输入:A = ...
- 【LeetCode】862. 和至少为 K 的最短子数组
862. 和至少为 K 的最短子数组 知识点:单调:队列:前缀和 题目描述 返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K . 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 ...
- [LeetCode] Subarray Product Less Than K 子数组乘积小于K
Your are given an array of positive integers nums. Count and print the number of (contiguous) subarr ...
- 【LeetCode】1460. 通过翻转子数组使两个数组相等 Make Two Arrays Equal by Reversing Sub-arrays (Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 判断排序后是否相等 统计字符出现次数 日期 题目地址: ...
- [Swift]LeetCode1031. 两个非重叠子数组的最大和 | Maximum Sum of Two Non-Overlapping Subarrays
Given an array A of non-negative integers, return the maximum sum of elements in two non-overlapping ...
- <二分查找+双指针+前缀和>解决子数组和排序后的区间和
<二分查找+双指针+前缀和>解决子数组和排序后的区间和 题目重现: 给你一个数组 nums ,它包含 n 个正整数.你需要计算所有非空连续子数组的和,并将它们按升序排序,得到一个新的包含 ...
- [Swift]LeetCode918. 环形子数组的最大和 | Maximum Sum Circular Subarray
Given a circular array C of integers represented by A, find the maximum possible sum of a non-empty ...
- [Swift]LeetCode930. 和相同的二元子数组 | Binary Subarrays With Sum
In an array A of 0s and 1s, how many non-empty subarrays have sum S? Example 1: Input: A = [1,0,1,0, ...
随机推荐
- 旧物利用 - 将机顶盒改造为一台Linux开发机!
前言 机顶盒型号:移动魔百盒CM201-2(CH),芯片组: hi3798mv300(hi3798mv3dmm),其他型号类似 理论上适用于以下SOC:Hi3798Mv100 / Hi3798Cv20 ...
- 结构体中vector的初始化报错:expected identifier before numeric constant
结构体中vector的初始化报错:expected identifier before numeric constant 结构体中vector初始化 起因: 我想在结构体中初始化含有3个元素的vect ...
- 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛)
2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛) RC-u1 热҈热҈热҈ #include<bits/stdc++.h> using namespace std; us ...
- 微服务全链路跟踪:jaeger集成hystrix
微服务全链路跟踪:grpc集成zipkin 微服务全链路跟踪:grpc集成jaeger 微服务全链路跟踪:springcloud集成jaeger 微服务全链路跟踪:jaeger集成istio,并兼容u ...
- .NET 高效开发Nuget管理工具(开源)
我们.NET开发会引用很多外部Nuget包,多项目.多个解决方案.甚至多个仓库. 简单的Nuget包管理,通过VS就能比较简单处理好.但复杂的场景呢,比如: 1.一个仓库里,有多个解决方案的Nuget ...
- elementui二维表动态渲染
elementUI如何动态渲染二维表,动态渲染表格的列,例如下图: 代码: <div id="app"> <template> <el-table : ...
- 一文了解JSON
目录 JSON 在JavaScript 中的使用. json 的定义 json 的访问 json 的两个常用方法 JSON 在 在 java 中的使用 javaBean 和 和 json 的互转 Li ...
- 旺旺发消息代码,hook旺旺发消息,旺旺发消息call
工作需要写的,不是反汇编旺旺,是千牛的,基于千牛前端架构开发利用千牛发消息的一个组件,可以拿来做千牛客服机器人,可以拿来做千牛自动发货.非协议破解需要挂机,非模拟发送消息,非模拟发送消息,非模拟发送消 ...
- 【笔记】利用七牛云CDN加速提高前端图片静态资源访问速率
第一步,注册七牛云账号 打开 七牛开发者平台,选择 注册,注册后登录系统然后实名认证. 第二步,创建七牛云空间 七牛对象存储将数据文件以资源的形式上传到空间中.您可以创建一个或者多个空间,然后向每个空 ...
- 【解题报告】P8478 「GLR-R3」清明
P8478 「GLR-R3」清明 参考了出题人题解和 xcyyyyyy 大神的题解,强推前两篇. 拿到题完全没思路怎么办??? 人类智慧的巅峰,思维量的登峰造极. 换句话说就是非人题目,不过不得不说 ...