leetcode力扣刷题系列——【找到按位或最接近 K 的子数组】

题目

给你一个数组 nums 和一个整数 k 。你需要找到 nums 的一个子数组,满足子数组中所有元素按位或运算 OR 的值与 k 的 绝对差 尽可能 小 。换言之,你需要选择一个子数组 nums[l…r] 满足 |k - (nums[l] OR nums[l + 1] … OR nums[r])| 最小。
请你返回 最小 的绝对差值。
子数组是数组中连续的 非空 元素序列。

示例 1
输入:
nums = [1,2,4,5], k = 3
输出
0
解释:
子数组 nums[0…1] 的按位 OR 运算值为 3 ,得到最小差值 |3 - 3| = 0 。

示例 2:

输入:
nums = [1,3,1,3], k = 2
输出:
1
解释:
子数组 nums[1…1] 的按位 OR 运算值为 3 ,得到最小差值 |3 - 2| = 1 。

示例 3:
输入:
nums = [1], k = 10

输出:
9
解释:
只有一个子数组,按位 OR 运算值为 1 ,得到最小差值 |10 - 1| = 9 。

提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
1 <= k <= 109

答案

我的方法
方法有问题,这道题在力扣中属于难题,对我而言也不简单,我就是简单的先找到所有的子列表,再找到所有的or值,在进行绝对值的运算,这样子确实简单易懂,但是一旦nums足够大,我们的程序就会超出内存大小。
今天也是没有完成今天的题目,还是因为我太菜啦,想不到更牛的方法,所以今天还是分享一下官方大大的解题思路和方法吧。

class Solution(object):def minimumDifference(self, nums, k):""":type nums: List[int]:type k: int:rtype: int"""# 获取数组中所有子数组的值subnums=[]result = []for i in range(len(nums)):for j in range(i,len(nums)):subnum = nums[i:j+1]subnums.append(subnum)# 算出每一个或运算的值for sublist in subnums:if len(sublist) == 1:result.append(sublist[0])else:or_result = sublist[0]for num in sublist[1:]:or_result = or_result | numresult.append(or_result)absnums = [abs(num - k) for num in result]return min(absnums)

注:我写的方法没啥用,并没有能通过测试

官方大大的方法
思路与算法
题目给定一个数组 nums 和一个整数 k。我们需要找到 nums 的一个非空子数组,要求其所有元素的或运算结果与 k 值尽可能接近。
根据或运算的性质,当我们固定子数组的右端点,不断地向左延伸左端点时,子数组或运算结果逐渐增加,并且结果种类数不超过 log(max(nums))+1 种。因为或运算结果每次增加对应于二进制表示中某些位上由 0 变为 1,因此增加的种类数受到数值范围的限制。

因此,我们从左到右遍历 nums,并在过程中记录每个二进制上的 1 出现的最晚的位置。这些位置用于我们在延伸左端点时,遍历所有种类的或运算结果。具体的,我们用 bits_max_pos[j] 来表示第 j 个二进制为 1 出现的最晚位置,在固定右端点后,将所有的二元组 (bits_max_pos[j],j) 从大到小排序,然后依次遍历这些二元组。遍历时将或运算结果与 2^j做或运算,得到新的结果,并计算其与 k 的差值。最终答案取所有差值的最小值。
需要注意的是,对于不同的 j,其 bits_max_pos[j] 可能相同,在计算区间或运算结果时需要将它们都考虑到,因此这里需要双指针去更新或运算结果。

代码

n = len(nums)bits_max_pos = [-1] * 31res = inffor i in range(n):for j in range(31):if nums[i] >> j & 1:bits_max_pos[j] = ipos_to_bit = [(bits_max_pos[j], j) for j in range(31) if bits_max_pos[j] != -1]pos_to_bit.sort(reverse = True, key = lambda x: x[0])j, val = 0, 0while j < len(pos_to_bit):p = jwhile j < len(pos_to_bit) and pos_to_bit[j][0] == pos_to_bit[p][0]:val |= 1 << pos_to_bit[j][1]j += 1res = min(res, abs(val - k))return res

作者:力扣官方题解
我是链接哦
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1558496.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

股指期货和股指期权有什么区别?

在金融衍生品的世界里&#xff0c;股权类衍生品无疑是其中的佼佼者&#xff0c;而股指期货和股指期权更是其中的佼佼者。尽管它们之间有着千丝万缕的联系&#xff0c;但它们之间的区别同样不容忽视。本文衍生股指君将详细解析股指期货和股指期权的核心区别。 一、交易的东西不…

数据库软题7-数据库设计

一、概念结构设计 题1-ER图的属性分类 题2-局部ER图的冲突分类 1.命名冲突 命名冲突有同名异义&#xff0c;异名同义2.结构冲突 结构冲突分为&#xff1a;统一实体不同属性&#xff0c;同一对象在不同关系里可能为属性或者实体 教师其实就是职工&#xff0c;他们有不同的属性…

5.将扩散模型应用于具有特殊结构的数据

虽然扩散模型在图像和音频等数据应用领域中取得了巨大的成功&#xff0c;但他们不一定能无缝地转移到其他模态上。在许多重要的领域&#xff0c;数据有特殊的结构。为了让扩散模型有效运作&#xff0c;必须考虑并处理这些特殊结构。比如&#xff0c;经典扩散模型所依赖的分数的…

「JVS更新日志」低代码、智能BI、逻辑引擎10.9功能更新说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架&#xff0c;主要解决企业信息化项目交付难、实施效率低、开发成本高的问题&#xff0c;采用微服务配置化的方式&#xff0c;提供了 低代码数据分析物联网的核心能力产品&#xff0c;并构建了协同办公、企业常用的管理工具等&am…

SDUT数据结构与算法第二次机测

目录 7-1 括号匹配 7-2 后缀式求值 7-3 表达式转换 7-4 【模板】KMP字符串匹配 比较详细注释和图解请看KMP——字符串匹配-CSDN博客&#xff0c;&#xff08;点击链接可跳转&#xff09;一看就会 7-5 约瑟夫环&#xff08;押题&#xff0c;重要&#xff09; 7-6 单调栈&a…

迪士尼数据泄露事件:全面审视数据安全策略与未来防护方向

迪士尼数据泄露事件概述 一、 事件背景以及影响 在全球数字化转型加速的浪潮中&#xff0c;数据安全已成为企业运营不可忽视的基石。 华特迪士尼公司&#xff0c;作为全球知名的娱乐传媒巨头&#xff0c;其数据泄露事件无疑为业界敲响了警钟。此次事件不仅揭示了数据保护的严…

Pymysql cur.fetchall() 返回 None

大家在pymysql 的 cur.fetchall() 函数通常用于获取执行 SQL 查询后的所有结果。该函数返回一个包含查询结果的元组列表。如果 cur.fetchall() 返回 None&#xff0c;可能是由于以下多种问题导致的。 1、问题背景 在使用 Pymysql 库连接到 MySQL 数据库时&#xff0c;遇到这样…

YOLOv5改进——普通卷积和C3模块更换为GhostConvV2卷积和C3GhostV2模块

目录 一、GhostNetV2核心代码 二、修改common.py 三、修改yolo.py 三、建立yaml文件 四、训练 一、GhostNetV2核心代码 在models文件夹下新建modules文件夹&#xff0c;在modules文件夹下新建一个py文件。这里为GhostV2.py。复制以下代码到文件里面。 # TODO: ghostnetv…

好用的免费录屏软件推荐,让软件操作教程制作不再困难

录屏软件就像是我们做教程或者玩游戏时的“小助手”&#xff0c;它能帮我们把屏幕上的东西都记录下来&#xff0c;让视频看起来更高大上。今天我就给你推荐三款免费的好货&#xff0c;用它们做教程&#xff0c;保证让你轻松又开心。 1. 福昕录屏大师 虫洞 https://www.foxits…

【读书笔记·VLSI电路设计方法解密】问题4:今天的设计环境中使用的主要工艺技术是什么

主流的工艺技术是互补金属氧化物半导体&#xff08;CMOS&#xff09;技术。其他技术还包括双极性、双极CMOS&#xff08;biCMOS&#xff09;、绝缘体上硅&#xff08;SOI&#xff09;和砷化镓&#xff08;GaAs&#xff09;。 在CMOS技术中&#xff0c;"互补对称"指的…

SD入门教程一:Stable Diffusion 基础(技术篇)

前言 在开篇的时候就大致讲了SD和VAE&#xff0c;那么今天我们具象化地再来讲讲Stable Diffusion&#xff08;稳定扩散&#xff09;。 严格说来它是一个由几个组件&#xff08;模型&#xff09;构成的系统&#xff0c;而非单独的一个模型。我以最常见的文生图为例&#xff0c;…

大型保险公司进行营销活动时,如何与外部客户实现文件安全外发?

大型保险公司为了吸引新客户、维护老客户、提升品牌形象以及推广特定的保险产品&#xff0c;会定期向外部客户或潜在客户发送营销文件。在客户签单后&#xff0c;保险公司会将客户相关的签单个人文件发送给客户。因此&#xff0c;大型保险公司内部存在较为频繁且重要的文件安全…

安装DNS

在 CentOS 7 上安装并配置 BIND 以实现 DNS 的正向和反向解析可以按照以下步骤进行&#xff1a; 安装 BIND 打开终端并运行以下命令来安装 BIND 及其工具&#xff1a; yum install bind bind-utils -y配置 BIND 编辑主配置文件&#xff1a; 使用文本编辑器打开 BIND 的主配…

电商价格监测的创新之路

在当今数字化高速发展的时代&#xff0c;电商如汹涌的浪潮席卷了商业的每一个角落。品牌们在这片广阔的电商海洋中奋力前行&#xff0c;而价格监测则成为了他们手中至关重要的罗盘。 力维网络以其专业的价格监测服务&#xff0c;为品牌在电商之海的航行点亮了一盏明灯。然而&a…

多节点网络流量监控与网络性能优化的利器——轻松实现高效管理

目录 为什么网络性能监控如此重要&#xff1f; 多节点网络流量监控如何优化网络性能&#xff1f; 实例&#xff1a;AnaTraf如何帮助企业解决网络故障 了解更多 随着企业网络规模的不断扩大&#xff0c;维护网络性能的复杂性日益增加。如何实时监控网络流量、快速排查网络故…

网安加·百家讲坛 | 潘继平:AI赋能DevOps平台:全面提升代码安全性

作者简介&#xff1a;潘继平&#xff0c;中国软协项目管理专委会专家&#xff0c;深圳市软件行业协会特聘专家。华为土耳其研究所外聘高级项目顾问&#xff0c;负责华为云应用生态圈产品线研发管理。曾为华为全球技术服务中心、华为制造IT以及华为流程IT解决方案提供等多个部门…

(二)、CT系统硬件构成

简单来说分为以下几个步骤来描述整个CT系统的运行流程&#xff1a; X射线管和探测器环绕被测物体&#xff0c;准直器进行高度准直X射线。X射线穿过被测物料时发生衰减&#xff0c;其中有两个探测器&#xff0c;一个是参考探测器记录和测量来自X射线管的辐射强度&#xff0c;另…

【C语言从不挂科到高绩点】28-数组综合运用

Hello&#xff01;彦祖们&#xff0c;俺又回来了&#xff01;&#xff01;&#xff01;&#xff0c;继续给大家分享 《C语言从不挂科到高绩点》课程!! 数组是我们在C语言学习过程中比较重要的一个知识点&#xff0c;也是在今后的学习与开发过程中经常会用到的技能&#xff0c;…

明达IO:赋能工业机器人新未来

摘要&#xff1a; 明达技术以其卓越的分布式IO&#xff08;MR30&#xff09;与一体式IO&#xff08;MR20&#xff09;产品&#xff0c;为工业机器人行业提供了完美的信号交互解决方案。在集群式机器人应用场景中&#xff0c;MR30分布式IO以其稳定性能和自由热插拔功能&#xf…

“跨时空拥抱”风靡TikTok,这款AI视频工具借势变现20万美金,你也来看看吧!

用AI生成跨时空拥抱最近悄悄在海外翻红&#xff0c;还带火了一款AI视频产品。 8月28日&#xff0c;TikTok博主“iammskira”发布了一条配文为“用AI实现了拥抱我的妈妈&#xff0c;因为她已经不在人世了”的短视频教程&#xff0c;在TikTok上走红。 视频中&#xff0c;AI不仅…