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:

chatgpt

题目来自leetcode3095。

大体步骤如下:

代码逻辑分析

1.初始化

  • minLen 被设置为 math.MaxInt32,用于存储找到的最短子数组的长度。

  • n 是数组 nums 的长度。

2.解决方案 1

  • 对于每一个索引 i0n-1,表示当前子数组的结束位置。

  • 对于每一个 ji 递减到 0,表示当前子数组的起始位置。

  • 检查从 ji 这段子数组的按位或结果,调用 isSpecial 函数。

  • 如果返回的结果满足大于等于 k,则更新 minLen 为当前子数组长度 i-j+1 的最小值。

  • 最后,如果没有找到满足条件的子数组,返回 -1;否则返回 minLen

3.isSpecial 函数

  • 接受数组 nums 和子数组的起始、结束索引 ji,以及目标值 k

  • 初始化结果 res0

  • 遍历子数组,计算位或结果 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)运的更多相关文章

  1. 用 C# 如何判断数据库中是否存在一个值

    选定一个列,比如用户编号列 //欲插入的用户编号string ll_userID="xxxxxxxx"; //查询此编号是否存在SqlCommand mycmd = new Sql ...

  2. [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 ...

  3. 和至少为K的最短子数组

    返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 1: 输入:A = [1], K = 1 输出:1 示例 2: 输入:A =  ...

  4. 【LeetCode】862. 和至少为 K 的最短子数组

    862. 和至少为 K 的最短子数组 知识点:单调:队列:前缀和 题目描述 返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K . 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 ...

  5. [LeetCode] Subarray Product Less Than K 子数组乘积小于K

    Your are given an array of positive integers nums. Count and print the number of (contiguous) subarr ...

  6. 【LeetCode】1460. 通过翻转子数组使两个数组相等 Make Two Arrays Equal by Reversing Sub-arrays (Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 判断排序后是否相等 统计字符出现次数 日期 题目地址: ...

  7. [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 ...

  8. <二分查找+双指针+前缀和>解决子数组和排序后的区间和

    <二分查找+双指针+前缀和>解决子数组和排序后的区间和 题目重现: 给你一个数组 nums ,它包含 n 个正整数.你需要计算所有非空连续子数组的和,并将它们按升序排序,得到一个新的包含 ...

  9. [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 ...

  10. [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, ...

随机推荐

  1. 高效调度新篇章:详解DolphinScheduler 3.2.0生产级集群搭建

    转载自tuoluzhe8521 导读:通过简化复杂的任务依赖关系, DolphinScheduler为数据工程师提供了强大的工作流程管理和调度能力.在3.2.0版本中,DolphinScheduler ...

  2. 十五张图带你快速入门 shardingsphere-proxy

    Apache ShardingSphere 是一款分布式的数据库生态系统,它包含两大产品: ShardingSphere-Proxy ShardingSphere-JDBC 很多同学对于 Shardi ...

  3. Vue3.5新增的baseWatch让watch函数和Vue组件彻底分手

    前言 在Vue 3.5.0-beta.3版本中新增了一个base watch函数,这个函数用法和我们熟知的watch API一模一样.区别就是我们之前用的watch API是和Vue组件以及生命周期是 ...

  4. P 问题和 NP 问题的简单理解

    P/NP问题 | 维基百科 P 问题 P 问题的定义是:所有可以由一个确定型图灵机在多项式表达的时间内解决的问题 P 代表 Polynomial-time (adj. 多项式时间) 简单理解:答案可以 ...

  5. Patlibc———更快捷的更换libc

    起初是为了简化做pwn题目时,来回更换libc的麻烦,为了简化命令,弄了一个小脚本,可以加入到/usr/local/bin中,当作一个快捷指令 这个写在了tools库(git clone https: ...

  6. C++:使自定义类支持迭代器

    概述 在 C++ 中,链表迭代器是一种用来遍历链表(如 std::list)元素的工具.链表是一种数据结构,其中每个元素(节点)包含一个数据值和一个指向下一个节点的指针.链表迭代器允许以类似于数组的方 ...

  7. CSS & JS Effect – sticky horizontal scrollbar

    需求 这个是 Google Ads 里的 table. 那个 horizontal scrollbar 可以 sticky bottom. 我们知道 scrollbar 是游览器原生的,我们能做的 s ...

  8. C++ cout打印输出 (解决输出乱码)

    cout打印输出 输出单份内容 // 输出单份内容 cout << "Hello World!" << endl; cout << 10 < ...

  9. Codeforces Round 955 (Div. 2)

    A 非常好特判 一共就五种情况,相等,或者正反两种包含(都是不能可能不包含),或者正反两种先后(都是可能不相等),写五个 if 就行了 B 我到底为什么要跳了这题??????????????????? ...

  10. 使用 Ant-Design-Vue 制作一个带图片上传功能的表单对话框

    功能需求 使用 Antdv 的 Modal 组件内嵌一个 a-form 表单,具有添加数据和图片的功能. 页面结构设计 <template> <!--Modal--> < ...