当前位置: 首页 > news >正文

【左神算法刷题班】第16节:累加和为k的数组、逆序对问题、约瑟夫环问题

题目1

给定一个有正、有负、有0的数组arr,

给定一个整数k,

返回arr的子集是否能累加出k

1)正常怎么做?

2)如果arr中的数值很大,但是arr的长度不大,怎么做?

问题 1)思路

如果数组中只有正数,那么这就是一个普通的背包问题,

递归函数用 process(i,j) 表示从0到i随便选,能否选出累加和为j的数字。

在 process 内部,可以选i,或者不选i。

  • 如果不选 i,就看 process(i-1, j) 是否返回 true
  • 如果选 i,就看 process(i-1, j-arr[i]) 是否返回 true

将递归转换成 dp,就是dp[i][j]表示从0到i随便选,能否选出累加和为j的数字。

dp 表的难点在于,数组中有负数,需要将下标做一个平移。

问题 2)思路

我的思路是,当 arr 数值很大的时候,可以用 暴力递归 + HashMap 来做缓存表,这样只需要计算那些用得到的结果,而不需要写满整个 arr 数据范围的结果。

左神的思路是,假设 arr 的长度是 40,用分治,左边 20 个数用暴力算出所有可能的累加和(2^20=1048576),右边也得到 1048576 个结果。(一般都是二分之后再整合,你要分成三部分也可以,但整合的时候就会复杂一些)

如果单独用左部分,或者单独用右部分,就能够得到目标累加和的话,直接返回就可以了。如果不行,要考虑左右合并的情况。

题目2

给定一个正数数组arr,

返回arr的子集“不能累加出的“最小正数

1)正常怎么做?

2)如果arr中肯定有1这个值,怎么做?

问题 1)思路

和题目 1 很像,而且所有的数都是正数,可以看成是一个普通的背包问题。

process(i,j) 表示从0到i随便选,能否选出累加和为j的数字。

在 process 内部,可以选i,或者不选i。

  • 如果不选 i,就看 process(i-1, j) 是否返回 true
  • 如果选 i,就看 process(i-1, j-arr[i]) 是否返回 true

最后从 j=1 开始 j++,一直找到第一个 process(i, j) 返回为 false 的 j,就是最终结果。

问题 2)思路

其实 问题1)的最优思路就是,如果没有 1,则返回答案 1。如果有 1,则用下面的思路。

先排序,排序后,左边第 0 位置一定是 1。

定义变量 range=1,含义为,从 1-range 范围上的正数都能累加出来。下面我们来分析 range 的扩充条件:

如果 1 位置的数还是 1,则 range 变成 2。

如果 2 位置的数是 2,则 range 变成 4。

普遍的,我来到 i 位置发现 arr[i]=17,range=100,代表从 0 到 i-1 位置能够得到 1~100 里的所有数,由此可以推断,加上 i 位置之后,可以得到 1~117 所有的数。

普遍的,我来到 i 位置发现 arr[i]=101,range=100,代表从 0 到 i-1 位置能够得到 1~100 里的所有数,由此可以推断,加上 i 位置之后,可以得到 1~201 所有的数。

但,普遍的,我来到 i 位置发现 arr[i]=102,range=100,代表从 0 到 i-1 位置能够得到 1~100 里的所有数,但以后怎么也得不到 101 了。

所以,range 扩充的条件是:

  • 如果 arr[i] > range+1,那么以后就再也得不到 range+1 的累加和了,直接返回 range+1
  • 否则,range 可以扩充为 range + arr[i]

题目3

Leetcode原题:

https://leetcode.com/problems/patching-array/

思路

我们先举一个极端的例子,假设 nums 为空,n=1000,我们想要生成从 1~1000 之间所有的数。

思路和题目2很像。用 range 表示当前能够得到的最大累加和。

首先我肯定需要 1,这样就能得到 [1,1] 区间所有的数,range = 1。

然后我需要 2,就可以得到 [1, 1+2] 区间所有的数,range = 3。

然后我需要 4,就可以得到 [1, 3+4] 区间所有的数,range = 7。

然后我需要 8,…

然后,我们忘掉前面的例子,举一个普遍的例子

假设 nums=[4, 5, 17, 39],n=83

首先我们来看 nums 中的第一个数字 4,我们要先能够得到 4 之前所有的数字,所以根据前面的分析,需要加入 1,2,得到 range=7

在此基础上,来到 nums 中的第二个数字 5,更新range为 7+5=12

在此基础上,来到 nums 中的第三个数字 17,不能直接更新 range,需要想办法得到 13 14 15 16。所以需要加入 range+1 = 13,并且更新 range 为 12+13=25。然后用 17 更新 range=25+17=42

在此基础上,来到 nums 中的第四个数字39,更新range为42+39=81

整个数组遍历结束了,而最终目标83还有距离,所以需要再补一个range+1=82,就能得到1~83范围内所有的数字。

题目4

给定整数power,给定一个数组arr,给定一个数组reverse,含义如下:

arr的长度一定是2的power次方

reverse中的每个值一定都在0~power范围。

例如power = 2, arr = {3, 1, 4, 2},reverse = {0, 1, 0, 2}

任何一个在前的数字可以和任何一个在后的数组,构成一对数

可能是升序关系、相等关系或者降序关系

比如arr开始时有如下的降序对:(3,1)、(3,2)、(4,2),一共3个

接下来根据reverse对arr进行调整:

reverse[0] = 0, 表示在arr中,划分每1(2的0次方)个数一组,然后每个小组内部逆序,那么arr变成[3,1,4,2],此时有3个逆序对

reverse[1] = 1, 表示在arr中,划分每2(2的1次方)个数一组,然后每个小组内部逆序,那么arr变成[1,3,2,4],此时有1个逆序对

reverse[2] = 0, 表示在arr中,划分每1(2的0次方)个数一组,然后每个小组内部逆序,那么arr变成[1,3,2,4],此时有1个逆序对

reverse[3] = 2, 表示在arr中,划分每4(2的2次方)个数一组,然后每个小组内部逆序,那么arr变成[4,2,3,1],此时有4个逆序对

所以返回[3,1,1,4],表示每次调整之后的逆序对数量

输入数据状况:

power的范围[0,20]

arr长度范围[1,10的7次方]

reverse长度范围[1,10的6次方]

思路

假设我们有 8 个数,arr = [2 1 7 5 3 4 6 8]

当以 2 个数为一组的时候,我们假设每个组内逆序对的个数之和是 a,正序对个数之和是 b

注意,每一个组内的逆序对,第一个数要来自组内左侧,第二个数要来自组内右侧。
这样,在每个组中逆序对相加,求总的逆序对数量的时候,才不会重复计算。2个一组的时候,[2 | 1] [7 | 5] [3 | 4] [6 | 8]
其中,正序对包括 (3,4),(6,8),正序对个数为2.
其中,逆序对包括 (2,1),(7,5),逆序对个数为2.4个一组的时候,[2 1 | 7 5][3 4 | 6 8]
其中,正序对包括 (2,7),(2,5),(1,7),(1,5),(3,6),(3,8),(4,6),(4,8),正序对个数为8.
其中,逆序对没有,逆序对个数为08个一组的时候,[2 1 7 5 | 3 4 6 8]
其中,正序对包括 (2,3),(2,4),(2,6),(2,8),(1,3),(1,4),(1,6),(1,8),(7,8),(5,6),(5,8),正序对个数为11.
其中,逆序对包括 (7,3),(7,4),(7,6),(5,3),(5,4),逆序对个数为5

同样的,我们假设 4(2的2次方)个一组的时候,逆序对的个数为 c,正序对个数之和是 d.

同样的,我们假设 8(2的3次方)个一组的时候,逆序对的个数为 e,正序对个数之和是 f.

我们把上面的假设总结成表格:

几个数一组逆序对的个数正序对的个数
2(2的1次方)ab
4(2的2次方)cd
8(2的3次方)ef

当我们将“ 4(2的2次方)个数字组成的小组”内部逆序的时候,它只影响“2(2的1次方)个数字一组”的小组,和“4(2的2次方)个数字一组的小组”,不会影响“8(2的3次方)一组的小组”。逆序后,表格变成如下:

几个数一组逆序对的个数正序对的个数
2(2的1次方)b(左右交换)a(左右交换)
4(2的2次方)d(左右交换)c(左右交换)
8(2的3次方)e(不变)f(不变)

普遍的,当我们要逆序“2的n次方个数字组成的小组”的时候,表格中,“2的n次方一组的小组”这一行下面的所有小组,都不会被影响。这一行上面的所有小组(包括自身),正序对个数和逆序对个数发生交换。

这样,每一次组内做逆序的时候,就可以非常快速的计算逆序之后的逆序对数量。

那么,怎么拥有一开始的表格信息?用归并排序来算。去看体系学习班第4节和第5节,是和merge sort有关的题目。

题目5

约瑟夫环问题

给定一个链表头节点head,和一个正数m

从头开始,每次数到m就杀死当前节点

然后被杀节点的下一个节点从1开始重新数,

周而复始直到只剩一个节点,返回最后的节点

Leetcode :

https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/

相关文章:

【左神算法刷题班】第16节:累加和为k的数组、逆序对问题、约瑟夫环问题

题目1 给定一个有正、有负、有0的数组arr, 给定一个整数k, 返回arr的子集是否能累加出k 1)正常怎么做? 2)如果arr中的数值很大,但是arr的长度不大,怎么做? 问题 1)…...

【React | 前端】在React的前端页面中,判断某个变量值是否被定义?根据是否定义显示不同的内容?

问题描述 在React的前端页面中,判断某个变量值是否被定义?根据是否定义显示不同的内容? 问题场景 假如,现在有一个需求是设计一个新功能,新功能中要求新增一个之前没有的变量,假设是计算某一个数组的长度…...

机器学习深度学习——seq2seq实现机器翻译(数据集处理)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——从编码器-解码器架构到seq2seq(机器翻译) 📚订阅专栏:机…...

锁定Mac的内置键盘,防止外接键盘时的误触

场景:把你的外接键盘放在mac上,然后打字时,发现外接键盘误触mac键盘,导致使用体验极差 解决方案:下载Karabiner-Elements这款软件,并给它开启相关权限。 地址:https://github.com/pqrs-org/Ka…...

由于找不到d3dx9_42.dll,无法继续执行代码。重新安装程序可能会解决此问题

d3dx9_42.dll是一个动态链接库文件,它是Microsoft DirectX 9的一部分。这个文件包含了DirectX 9的一些函数和资源,用于支持计算机上运行基于DirectX 9的应用程序和游戏。它通常用于提供图形、音频和输入设备的支持,以及其他与图形和游戏相关的…...

解决Vue+Element UI使用el-dropdown(下拉菜单)国际化时菜单label信息没有刷新的情况

说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 问题描述 在默认中文时,点击布局大小下拉菜单正常显示中文,此时切换至英文时,再次点击下拉菜单,还…...

Prometheus技术文档-概念

Prometheus是一个开源的项目连接如下: Prometheus首页、文档和下载 - 服务监控系统 - OSCHINA - 中文开源技术交流社区 基本概念: Prometheus是一个开源的系统监控和告警系统,由Google的BorgMon监控系统发展而来。它主要用于监控和度量各种…...

JQuery判断radio(单选框)是否选中和获取选中值方法总结

使用checked属性判断选中、jquery获取radio单选按钮的值、获取一组radio被选中项的值、设置单选按钮被选中等&#xff0c;详细如下&#xff1a; 一、利用获取选中值判断选中 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.…...

Effective Python 读书笔记

文章目录 前言第1章&#xff1a;用Pythonic方式来思考 1. 用Pythonic方式来思考 2. 遵循PEP8风格3. 了解bytes, str, unicode区别4. 用辅助函数取代复杂表达式5. 了解切割序列的方法6. 单次切片操作内&#xff0c;不要同时指定start, end, stride 7. 用列表推导取代map, filter…...

Monge矩阵

Monge矩阵 对一个m*n的实数矩阵A&#xff0c;如果对所有i&#xff0c;j&#xff0c;k和l&#xff0c;1≤ i<k ≤ m和1≤ j<l ≤ n&#xff0c;有 A[i,j]A[k,l] ≤ A[i,l]A[k,j] 那么&#xff0c;此矩阵A为Monge矩阵。 换句话说&#xff0c;每当我们从矩阵中挑…...

(5)所有角色数据分析页面的构建-5

所有角色数据分析页面&#xff0c;包括一个时间轴柱状图、六个散点图、六个柱状图(每个属性角色的生命值/防御力/攻击力的max与min的对比)。 """绘图""" from pyecharts.charts import Timeline from find_type import FindType import pandas …...

专利进阶(三):专利撰写资料汇总

文章目录 一、前言二、资料汇总三、拓展阅读 一、前言 在专利撰写前&#xff0c;需要首先了解专利撰写所需遵守的基本规则。可以借助的撰写工具是什么。文献检索在哪里&#xff1f;注意事项是什么&#xff1f;本篇博文会就以上问题进行逐一解答。 专利撰写基本原则&#xff1…...

maven编译始终提示无效的目标发行版的解决方法

摘自个人印象笔记2021-05-07&#xff1a;https://app.yinxiang.com/fx/55e1d5f4-aeea-446a-a768-0f1a48195f5b(图显示不完整可查看原笔记内容)1&#xff1a;确保IDE中的编译版本正确 在idea中&#xff0c;主要看项目属性中和setting的java compiler中对应的jdk版本是否正确&…...

系统架构设计高级技能 · 软件可靠性分析与设计(三)【系统架构设计师】

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…...

界面控件DevExpress WPF Chart组件——拥有超快的数据可视化库!

DevExpress WPF Chart组件拥有超大的可视化数据集&#xff0c;并提供交互式仪表板与高性能WPF图表库。DevExpress Charts提供了全面的2D / 3D图形集合&#xff0c;包括数十个UI定制和数据分析/数据挖掘选项。 PS&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助…...

【网络安全】等保测评安全物理环境

【网络安全】等保测评&安全物理环境 前言第1章 安全物理环境1.1 物理位置选择1.2 物理访问控制&#xff08;高风险项&#xff09;1.3 防盗窃1.4 防雷击1.5 防火1.6 防水防潮1.7 防静电1.8 温湿度控制1.9 电力供应1.10 电磁防护 前言 等级保护对象是由计算机或其他信息终端…...

Intellij IDEA 导入 eclipse web 项目详细操作

Eclipse当中的web项目都会有这两个文件。但是idea当中应该是没有的&#xff0c;所以导入会出现兼容问题。但是本篇文章会教大家如何导入&#xff0c;并且导入过后还能使用tomcat运行。文章尽可能以图片的形式进行演示。我的idea使用的版本是2022.3.3版本。当然按正常来说版本之…...

安卓java A应用切换到B应用,来回切换不执行OnCreate

需求&#xff1a;安卓java如何做到A应用切换到B应用&#xff0c;如果B应用没启动就启动&#xff0c;如果B应用已经启动就仅仅切换到B应用。B应用再切换回A应用&#xff0c;不要重复执行OnCreate! 在 A 应用中的&#xff1a; 在 A 应用中&#xff0c;如果你希望在切换回 B 应用…...

【Linux】批量恢复文件权限

批量恢复文件权限 Linux 中&#xff0c;如果意外误操作将根目录目录权限批量设置&#xff0c;比如 chmod -R 777 / &#xff0c;系统中的大部分服务以及命令将无法使用&#xff0c;这时候可以通过系统自带的 getfacl 命令来拷贝和还原系统权限&#xff0c;若是其他系统目录被误…...

数据可视化(八)堆叠图,双y轴,热力图

1.双y轴绘制 #双Y轴可视化数据分析图表 #add_subplot() dfpd.read_excel(mrbook.xlsx) x[i for i in range(1,7)] y1df[销量] y2df[rate] #用来正常显示负号 plt.rcParams[axes.unicode_minus]False figplt.figure() ax1fig.add_subplot(1,1,1)#一行一列&#xff0c;第一个区域…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...