2025-01-08:找到按位或最接近 K 的子数组。用go语言,给定一个数组 nums 和一个整数 k,你的目标是找到一个子数组,使得该子数组中所有元素进行按位或运算后的结果与 k 之间的绝对差值尽
2025-01-08:找到按位或最接近 K 的子数组。用go语言,给定一个数组 nums 和一个整数 k,你的目标是找到一个子数组,使得该子数组中所有元素进行按位或运算后的结果与 k 之间的绝对差值尽量小。
具体地,你需要确定一个子数组 nums[l..r],使得以下表达式的值最小化:
|k - (nums[l] OR nums[l + 1] ... OR nums[r])|
最后,返回这个最小绝对差值。
这里所说的子数组指的是数组中连续的非空元素序列。
1 <= nums.length <= 100000。
1 <= nums[i] <= 1000000000。
1 <= k <= 1000000000。
输入:nums = [1,2,4,5], k = 3。
输出:0。
解释:
子数组 nums[0..1] 的按位 OR 运算值为 3 ,得到最小差值 |3 - 3| = 0 。
答案2025-01-08:
题目来自leetcode3171。
大体步骤如下:
1.初始化 bitsMaxPos 数组,用于记录每个元素在每位上的最大位置,初始值为 -1。
2.初始化结果 res 为整数最大值 math.MaxInt。
3.遍历数组 nums:
a. 对于每个元素,记录其在 bitsMaxPos 数组中每位上的位置,即进行按位运算并更新 bitsMaxPos。
b. 构建二维数组 posToBit,记录每个位的最大位置和该位的值。
c. 按照每位最大位置倒序排序 posToBit 数组。
d. 遍历 posToBit 数组,计算包含当前位的所有可能组合的按位或值,更新结果 res。
4.最终返回 res 作为最小绝对差值。
总体而言,这个算法的时间复杂度取决于数组长度 n,其中对数组进行了遍历和排序操作。
额外空间复杂度主要取决于辅助数组的大小和额外变量的空间开销,约为 O(n)。
Go完整代码如下:
package main
import (
"fmt"
"sort"
"math"
)
func minimumDifference(nums []int, k int) int {
n := len(nums)
bitsMaxPos := make([]int, 31)
for i := range bitsMaxPos {
bitsMaxPos[i] = -1
}
res := math.MaxInt
for i := 0; i < n; i++ {
for j := 0; j <= 30; j++ {
if nums[i]>>j & 1 == 1 {
bitsMaxPos[j] = i
}
}
posToBit := make([][2]int, 0)
for j := 0; j <= 30; j++ {
if bitsMaxPos[j] != -1 {
posToBit = append(posToBit, [2]int{bitsMaxPos[j], j})
}
}
sort.Slice(posToBit, func(a, b int) bool {
return posToBit[a][0] > posToBit[b][0]
})
val := 0
for j, p := 0, 0; j < len(posToBit); p = j {
for j < len(posToBit) && posToBit[j][0] == posToBit[p][0] {
val |= 1 << posToBit[j][1]
j++
}
res = min(res, int(math.Abs(float64(val - k))))
}
}
return res
}
func main() {
nums := []int{1,2,4,5}
k := 3
result := minimumDifference(nums,k)
fmt.Println(result)
}

Rust完整代码如下:
use std::cmp;
use std::collections::HashSet;
fn minimum_difference(nums: Vec<i32>, k: i32) -> i32 {
let n = nums.len();
let mut bits_max_pos = [-1; 31];
let mut res = i32::MAX;
for i in 0..n {
for j in 0..=30 {
if nums[i] >> j & 1 == 1 {
bits_max_pos[j] = i as i32;
}
}
let mut pos_to_bit: Vec<(i32, i32)> = Vec::new();
for j in 0..=30 {
if bits_max_pos[j] != -1 {
pos_to_bit.push((bits_max_pos[j], j as i32));
}
}
pos_to_bit.sort_by(|a, b| b.0.cmp(&a.0));
let mut val = 0;
let mut j = 0;
let mut p = 0;
while j < pos_to_bit.len() {
p = j;
while j < pos_to_bit.len() && pos_to_bit[j].0 == pos_to_bit[p].0 {
val |= 1 << pos_to_bit[j].1;
j += 1;
}
res = cmp::min(res, (val - k).abs() as i32);
}
}
res
}
fn main() {
let nums = vec![1, 2, 4, 5];
let k = 3;
let result = minimum_difference(nums, k);
println!("{}", result);
}

C完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// Helper function to find the minimum of two integers
int min(int a, int b) {
return (a < b) ? a : b;
}
int minimumDifference(int nums[], int size, int k) {
int bitsMaxPos[31];
for (int i = 0; i < 31; i++) {
bitsMaxPos[i] = -1;
}
int res = INT_MAX;
for (int i = 0; i < size; i++) {
for (int j = 0; j <= 30; j++) {
if ((nums[i] >> j) & 1 == 1) {
bitsMaxPos[j] = i;
}
}
int posToBit[size][2];
int count = 0;
for (int j = 0; j <= 30; j++) {
if (bitsMaxPos[j] != -1) {
posToBit[count][0] = bitsMaxPos[j];
posToBit[count][1] = j;
count++;
}
}
// Sort
for (int a = 0; a < count; a++) {
for (int b = a+1; b < count; b++) {
if (posToBit[a][0] < posToBit[b][0]) {
int temp0 = posToBit[a][0];
int temp1 = posToBit[a][1];
posToBit[a][0] = posToBit[b][0];
posToBit[a][1] = posToBit[b][1];
posToBit[b][0] = temp0;
posToBit[b][1] = temp1;
}
}
}
int val = 0;
for (int j = 0, p = 0; j < count; p = j) {
while (j < count && posToBit[j][0] == posToBit[p][0]) {
val |= 1 << posToBit[j][1];
j++;
}
res = min(res, abs(val - k));
}
}
return res;
}
int main() {
int nums[] = {1, 2, 4, 5};
int size = sizeof(nums) / sizeof(nums[0]);
int k = 3;
int result = minimumDifference(nums, size, k);
printf("%d\n", result);
return 0;
}

C++完整代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <climits>
int min(int a, int b) {
return (a < b) ? a : b;
}
int minimumDifference(std::vector<int> nums, int k) {
int n = nums.size();
std::vector<int> bitsMaxPos(31, -1);
int res = INT_MAX;
for (int i = 0; i < n; i++) {
for (int j = 0; j <= 30; j++) {
if ((nums[i] >> j) & 1 == 1) {
bitsMaxPos[j] = i;
}
}
std::vector<std::pair<int, int>> posToBit;
for (int j = 0; j <= 30; j++) {
if (bitsMaxPos[j] != -1) {
posToBit.push_back(std::make_pair(bitsMaxPos[j], j));
}
}
std::sort(posToBit.begin(), posToBit.end(), [](const std::pair<int, int>& a, const std::pair<int, int>& b) {
return a.first > b.first;
});
int val = 0;
for (int j = 0, p = 0; j < posToBit.size(); p = j) {
while (j < posToBit.size() && posToBit[j].first == posToBit[p].first) {
val |= 1 << posToBit[j].second;
j++;
}
res = min(res, std::abs(val - k));
}
}
return res;
}
int main() {
std::vector<int> nums = {1, 2, 4, 5};
int k = 3;
int result = minimumDifference(nums, k);
std::cout << result << std::endl;
return 0;
}

Python完整代码如下:
# -*-coding:utf-8-*-
import math
def minimum_difference(nums, k):
n = len(nums)
bits_max_pos = [-1] * 31
res = math.inf
for i in range(n):
for j in range(31):
if nums[i] >> j & 1 == 1:
bits_max_pos[j] = i
pos_to_bit = []
for j in range(31):
if bits_max_pos[j] != -1:
pos_to_bit.append((bits_max_pos[j], j))
pos_to_bit.sort(key=lambda x: x[0], reverse=True)
val = 0
j = 0
p = 0
while j < len(pos_to_bit):
p = j
while j < len(pos_to_bit) and pos_to_bit[j][0] == pos_to_bit[p][0]:
val |= 1 << pos_to_bit[j][1]
j += 1
res = min(res, abs(val - k))
return res
if __name__ == "__main__":
nums = [1, 2, 4, 5]
k = 3
result = minimum_difference(nums, k)
print(result)

2025-01-08:找到按位或最接近 K 的子数组。用go语言,给定一个数组 nums 和一个整数 k,你的目标是找到一个子数组,使得该子数组中所有元素进行按位或运算后的结果与 k 之间的绝对差值尽的更多相关文章
- smoj2828子数组有主元素
题面 一个数组B,如果有其中一个元素出现的次数大于length(B) div 2,那么该元素就是数组B的主元素,显然数组B最多只有1个主元素,因为数组B有主元素,所以被称为"优美的" ...
- 剑指Offer-连续子数组中的最大和
题目 输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为 O(n). 输入 [1,-2,3,10,-4,7,2,-5] 返回值 ...
- Java算法-求最大和的子数组序列
问题:有一个连续数组,长度是确定的,它包含多个子数组,子数组中的内容必须是原数组内容中的一个连续片段,长度不唯一,子数组中每个元素相加的结果称为子数组的和,现要求找出和最大的一个子数组. 具体算法如下 ...
- LeetCode-2104 子数组范围和
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sum-of-subarray-ranges 题目描述 给你一个整数数组 nums .nums 中 ...
- 实现子数组和绝对值差最小 - Objective-C
类似于背包问题,前提条件是数组全是正整数和0,先求和Sum,再从子数组中找出接近Sum/2的子数组 @interface TempState : NSObject @property (nonatom ...
- N元数组的子数组之和的最大值
题目:有N个整数的元素的一维数组,求子数组中元素之和中最大的一组(思想:动态规划) 分析: 设该数组为array[N], 那么对于array[i]该不该在元素之和最大的那个子数组中呢?首先,不如假设a ...
- [LeetCode] Maximum Average Subarray II 子数组的最大平均值之二
Given an array consisting of n integers, find the contiguous subarray whose length is greater than o ...
- [Swift]LeetCode978. 最长湍流子数组 | Longest Turbulent Subarray
A subarray A[i], A[i+1], ..., A[j] of A is said to be turbulent if and only if: For i <= k < j ...
- [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 ...
- 【IT笔试面试题整理】连续子数组的最大和
[试题描述]输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值.要求时间复杂度O(n). 思路:当我们加上一个正数时,和会增加:当我们加上一个 ...
随机推荐
- 顺序结构程序设计(python)
文章目录 1.python运算符 1.1 python算数运算 1.2python比较运算符 1.3 Python赋值运算符 1.4 python逻辑运算符 1.5 python成员运算符 1.6py ...
- nextjs 实战开发1 Mercury 二级域名分发系统| 曲速引擎 Warp Drive
开发目标 开发一个免费的二级域名分发系统 创建项目 root@ubuntu:~/dev-nextjs/mercury_frontend# pnpm create next-app@latest .版本 ...
- C#/.NET/.NET Core技术前沿周刊 | 第 11 期(2024年10.21-10.31)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- Python计算1到100偶数的加和
sum_value = 0 for i in range(1,101): if i % 2 == 1: continue sum_value += i print(sum_value) print(s ...
- 使用 C# 入门深度学习:Pytorch 基础
教程名称:使用 C# 入门深度学习 作者:痴者工良 地址: https://torch.whuanle.cn 1.2 Pytorch 基础 本文内容介绍 Pytorcn 的基础 API,主要是数组的创 ...
- C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- IPC-6012F-CN-中文版\英文版,2024 刚性印制板的鉴定及性能规范
IPC-6012F-CN-中文版,2024 刚性印制板的鉴定及性能规范 链接:https://pan.baidu.com/s/1z1x5JPmcRHzeIQgMsMQRxg提取码:1234 https ...
- 1000+节点、200+集群,Slack如何利用Karpenter降本增效?
原文首发于云妙算 Slack 是一款 AI 工作管理和协作平台.随着业务需求的增长,Slack 对其内部计算编排平台进行了重大改造,以增强可扩展性.提高效率并降低成本.该内部平台的代号为"B ...
- 关于XML文档和JAVA中的JTree之间如何转换的问题
关于XML文档和JAVA中的JTree之间如何转换的问题 XML因为良好的结构,被广泛地应用于文档格式的定义.我们知道,应用软件一般需要用配置文件来决定运行时的一些 参数.以前的应用程序的配置文件一般 ...
- Python之pandas读取Excel
#! -*- coding utf-8 -*- """ 模块功能:读取当前文件夹下的Source里的Excel文件,显示其相关信息 说明:默认把Excel的第一行当做列名 ...