【位运算 试填法】【推荐】3022. 给定操作次数内使剩余元素的或值最小

算法可以发掘本质,如:
一,若干师傅和徒弟互有好感,有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。
二,有无限多1X2和2X1的骨牌,某个棋盘若干格子坏了,如何在没有坏的格子放足够多骨牌。
三,某个单色图,1表示前前景,0表示后景色。每次操作可以将一个1,变成0。如何在最少得操作情况下,使得没有两个1相邻(四连通)。
四,若干路人,有些人是熟人,如何选出最多的人参加实验。为了避免熟人影响实验的效果,参加的人不能是熟人。
一二是二分图的最大匹配,三是二分图的最小点覆盖,四是二分图最大独立集。 而这三者是等效问题。

本文涉及知识点

位运算 试填法

LeetCode 3022. 给定操作次数内使剩余元素的或值最小

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。
一次操作中,你可以选择 nums 中满足 0 <= i < nums.length - 1 的一个下标 i ,并将 nums[i] 和 nums[i + 1] 替换为数字 nums[i] & nums[i + 1] ,其中 & 表示按位 AND 操作。
请你返回 至多 k 次操作以内,使 nums 中所有剩余元素按位 OR 结果的 最小值 。
示例 1:
输入:nums = [3,5,3,2,7], k = 2
输出:3
解释:执行以下操作:

  1. 将 nums[0] 和 nums[1] 替换为 (nums[0] & nums[1]) ,得到 nums 为 [1,3,2,7] 。
  2. 将 nums[2] 和 nums[3] 替换为 (nums[2] & nums[3]) ,得到 nums 为 [1,3,2] 。
    最终数组的按位或值为 3 。
    3 是 k 次操作以内,可以得到的剩余元素的最小按位或值。
    示例 2:
    输入:nums = [7,3,15,14,2,8], k = 4
    输出:2
    解释:执行以下操作:
  3. 将 nums[0] 和 nums[1] 替换为 (nums[0] & nums[1]) ,得到 nums 为 [3,15,14,2,8] 。
  4. 将 nums[0] 和 nums[1] 替换为 (nums[0] & nums[1]) ,得到 nums 为 [3,14,2,8] 。
  5. 将 nums[0] 和 nums[1] 替换为 (nums[0] & nums[1]) ,得到 nums 为 [2,2,8] 。
  6. 将 nums[1] 和 nums[2] 替换为 (nums[1] & nums[2]) ,得到 nums 为 [2,0] 。
    最终数组的按位或值为 2 。
    2 是 k 次操作以内,可以得到的剩余元素的最小按位或值。
    示例 3:
    输入:nums = [10,7,10,3,9,14,9,4], k = 1
    输出:15
    解释:不执行任何操作,nums 的按位或值为 15 。
    15 是 k 次操作以内,可以得到的剩余元素的最小按位或值。
    提示:
    1 <= nums.length <= 105
    0 <= nums[i] < 230
    0 <= k < nums.length

试填法

i H a s ∣ = i : 0 n − 1 n u m s [ i ] iHas \Large|=_{i:0}^{n-1}nums[i] iHas=i:0n1nums[i]
假定我们能消除 iRemove,其中iRemvoe&iHas == iHas。
最终结果 iHas - iRemove。
iCanMove = ~iHas。
如果iCanMove的最高位i能消除,则 :
iCanMove -= (1 << i )
iRemove += (1 << i )
否则:
iCanMove -= (1 << i )

假定新的最高位i1,则iTest = iRemove + (1 <<i1)
如果iTest能消除:
iCanMove -= (1 << i )
iRemove = iTest
否则:
iCanMove -= (1 << i )
直到 iCanMove为0。可以不修改iCanMove,直接枚举iCanMove。也可以不需要iCanMove,直接i=29 to 0 ,然后判断(1 << i ) & iHas 是否为真。

计算消除iTest需要的次数

将nums分成若干区间[i1,i2] ∀ \forall i ∈ \in [i1,i2] ,nums[i]& iTest 为真。
∀ \forall i n o t ∈ not\in not [i1,i2] nums[i]& iTest 为假。
cur = iTest cur A n d = i : i 1 i 2 n u m s [ i ] \Large And=_{i:i1}^{i2}nums[i] And=i:i1i2nums[i]
{ i 2 − i 1 次 c u r = = 0 无法消除 e l s e i f ( 0 = = i 1 ) 且 ( i 2 = = n u m s . s i z e ( ) − 1 ) i 2 + i 1 次 e l s e \begin{cases} i2-i1次 && cur==0 \\ 无法消除 && else \quad if (0==i1)且(i2==nums.size()-1) \\ i2+i1次 && else \\ \end{cases} i2i1无法消除i2+i1cur==0elseif(0==i1)(i2==nums.size()1)else
第一种情况:从i1到i2消除。
第二种情况:无法消除
第三种情况:消除[i1,i2]及左侧或右侧的元素。
第一种情况可以继续细分:如果[i1,i3]可以消除,则i3-i1次消掉,[i3+!,i2]下次再消。

代码

核心代码

class Solution {
public:int minOrAfterOperations(vector<int>& nums, int k) {for (const auto& n : nums) {m_iHas |= n;}int iRemove = 0;for (int i = 29; i >= 0; i--) {if (m_iHas & (1 << i)) {if (Need(nums, iRemove + (1 << i)) <= k) {iRemove += (1 << i);}}}return m_iHas - iRemove;}int Need(const vector<int>& nums, int iTest) {int iAnd = iTest;int iCnt = 0;int iNeed = 0;for (int i = 0; i < nums.size(); i++){if (nums[i] & iTest) {iCnt++;iAnd &= nums[i];if (0 == iAnd) {iNeed += iCnt - 1;iCnt = 0;iAnd = iTest;}}else{iNeed += iCnt - 1 + (0 != iAnd);iCnt = 0;iAnd = iTest;}}if ((nums.size() == iCnt) && (iAnd)) {return 1'000'000'000;}iNeed += iCnt - 1 + (0 != iAnd);return iNeed;}int m_iHas = 0;
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}}int main()
{	vector<int> nums;int k;{Solution sln;nums = { 3, 5, 3, 2, 7 }, k = 2;auto res = sln.minOrAfterOperations(nums, k);Assert(3, res);}{Solution sln;nums = { 7,3,15,14,2,8 }, k = 4;auto res = sln.minOrAfterOperations(nums, k);Assert(2, res);}{Solution sln;nums = { 10,7,10,3,9,14,9,4 }, k = 1;auto res = sln.minOrAfterOperations(nums, k);Assert(15, res);}{Solution sln;nums = { 37,6,46,32,23 }, k = 3;auto res = sln.minOrAfterOperations(nums, k);Assert(4, res);}
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element-ui container 组件源码分享

今日简单分享 container 组件的源码实现&#xff0c;从以下两个方面来讲解&#xff1a; 1、container 组件的页面结构 2、container 组件的属性 一、container 组件的页面结构 二、container 组件的属性 1、container 部分的 direction 属性&#xff0c;子元素的排列方向&am…

恒驰喜讯 | 荣耀加冕,十九载并肩瑞星,共守信息安全防线

近日&#xff0c;作为北京瑞星网安技术股份有限公司&#xff08;以下简称“瑞星”&#xff09;的核心合作伙伴&#xff0c;上海恒驰信息系统有限公司&#xff08;以下简称“恒驰信息”&#xff09;荣获瑞星2023年度“华中区域销售冠军奖”和“华东区域忠诚合作奖”两项表彰。 2…

我的五星工作神器Apps

大家好呀&#xff01;&#x1f44b; 今天我要来种草五款让我工作如鱼得水的神奇App&#xff0c;每一款都是我亲自试用&#xff0c;绝对良心推荐哦&#xff01;赶紧拿出小本本记下来吧&#xff01;&#x1f4dd; 1️⃣【亿可达】——软件连接器 它是一款自动化工具&#xff0c;…

非监督学习的模型为条件概率分布P(z|x)和p(x|z)的区别

在无监督学习中&#xff0c;假设X是输入空间&#xff0c;Z是输出的隐式结构空间&#xff0c;要学习的模型非概率模型情况可以表示为函数zg(x)&#xff0c;概率模型情况下表示为条件概率分布P&#xff08;z|x&#xff09;或p(x∣z)&#xff0c;它们 都可以用来描述数据中的潜在结…

Window安装Redis

安装Redis-Service 下载并安装最新版Redis-windows &#xff1a; https://github.com/redis-windows/redis-windows 安装Redis-Manager Another Redis Desktop Manager 是一款优秀Redis桌面(GUI)管理客户端 参考链接 https://redis.io/

java的volatile

在Java中&#xff0c;线程之间对内存写入操作的可见性是一个重要的问题&#xff0c;因为每个线程都有自己的工作内存&#xff0c;并且线程之间共享主内存。当一个线程修改了共享变量的值&#xff0c;其他线程并不一定能立即看到这个修改&#xff0c;这就是所谓的可见性问题。 例…

Go微服务: 服务限流原理, 负载均衡与API网关

微服务里面的限流 (uber/limit)概述 go 微服务保稳三剑客: 熔断&#xff0c;限流&#xff0c;负载均衡限流的作用 限制流量&#xff0c;在服务端生效 注意&#xff1a;熔断是客户端生效 保护后端服务 餐厅吃饭排队的问题&#xff0c;提供凳子&#xff0c;让等候&#xff0c;这就…

红黑树(Red Black Tree)

红黑树&#xff08;Red Black Tree&#xff09; 红黑树&#xff08;Red Black Tree&#xff09; 是一种自平衡二叉查找树 红黑树是在1972年由Rudolf Bayer发明的&#xff0c;当时被称为平衡二叉B树&#xff08;symmetric binary B-trees&#xff09;后来&#xff0c;在1978年…

海外商城小程序开发分析

【内容摘要】 在海外做商城小程序的可行性、优势与劣势。 我们将从市场需求、技术实现、竞争环境、政策法规等方面进行分析&#xff0c;为有意进军海外市场的企业提供有价值的参考。 【正文】 一、可行性分析 1. 市场需求&#xff1a;随着全球化的加速&#xff0c;海外市场…

喜讯 | “泰迪杯”数据挖掘挑战赛再次进入计算机类竞赛指数榜单

4月15日&#xff0c;第61届中国高等教育博览会在福州召开。在教师教学发展与创新人才培养论坛上&#xff0c;浙江大学何钦铭教授代表《全国普通高校大学生计算机类竞赛指数》专家工作组发布了最新一年的竞赛指数。据悉&#xff0c;今年的竞赛项目清单包含了28项赛事&#xff0c…

中国人工智能产业年会智能交通与自动驾驶专题全景扫描

中国人工智能产业年会&#xff08;CAIIAC&#xff09;是中国人工智能技术发展和应用的重要展示平台&#xff0c;不仅关注创新&#xff0c;还涵盖了市场和监管方面的内容&#xff0c;对于促进人工智能领域的发展起到了重要作用。年会汇集了来自学术界、工业界和政府的专家&#…

Udio——革命性的AI音乐生成软件

Udio是一款革命性的AI音乐生成软件&#xff0c;由前谷歌DeepMind的顶尖AI研究人员和工程师共同创立&#xff0c;得到著名风险投资公司a16z的支持。它旨在为音乐爱好者和专业人士提供一个全新的音乐创作和分享平台。用户可以通过文本提示来生成音乐&#xff0c;支持广泛的音乐风…