330. Patching Array
Given a sorted positive integer array nums and an integer n, add/patch elements to the array such that any number in range [1, n]
inclusive can be formed by the sum of some elements in the array. Return the minimum number of patches required.
Example 1:
Input: nums =[1,3]
, n =6
Output: 1 Explanation: Combinations of nums are[1], [3], [1,3]
, which form possible sums of:1, 3, 4
. Now if we add/patch2
to nums, the combinations are:[1], [2], [3], [1,3], [2,3], [1,2,3]
. Possible sums are1, 2, 3, 4, 5, 6
, which now covers the range[1, 6]
. So we only need1
patch.
Example 2:
Input: nums =[1,5,10]
, n =20
Output: 2 Explanation: The two patches can be[2, 4]
.
Example 3:
Input: nums =[1,2,2]
, n =5
Output: 0
class Solution { public int minPatches(int[] nums, int n) { int patchCount = 0; int index = 0; long miss = 1; while (miss <= n) { if (index < nums.length && nums[index] <= miss) { miss += nums[index++]; } else { miss += miss; patchCount++; } } return patchCount; }}
看起来是要补最小可以用的数字,大的不行?比如【1,5,10】,20就可以补9?实际上只能补2,3.??
??
实际上不行,题目是要【1,n】之间所有数字能被任意子集之和cover,如果补9,就不能帮我们cover比如7,8。
意思就是subset和必可以成为【1,n】的任意一项。
首先可以确定的是,
nums
中必然包含1,如果不包含1,那么[1,n]
这个范围中的1就没法实现- 其次数组中的元素不能重复使用,如果允许重复使用,那么把1重复多次,就可以组成任意整数。
令miss
为[0,n]
中缺少的最小整数,意味着我们可以实现[0,miss)
范围内的任意整数。
- 如果数组中有某个整数
x<=miss
, 那么我们可以把[0,miss)
区间的所有整数加上x
,区间变成了[x, miss+x)
,由于区间[0,miss)
和[x, miss+x)
重叠,两个区间可以无缝连接起来,意味着我们可以把区间[0,miss)
扩展到[0, miss+x)
。 - 如果数组中不存在小于或等于
miss
的元素,则区间[0,miss)
和[x, miss+x)
脱节了,连不起来。此时我们需要添加一个数,最大限度的扩展区间[0, miss)
。那添加哪个数呢?当然是添加miss
本身,这样区间[0,miss)
和[miss, miss+miss)
恰好可以无缝拼接。
举个例子,令nums=[1, 2, 4, 13, 43]
, n=100
,我们需要让[1,100]
内的数都能够组合出来。
使用数字1,2,4
,我们可以组合出[0, 8)
内的所有数,但无法组合出8,由于下一个数是13,比8大,根据规则2,我们添加8,把区间从[0,8)
扩展到[0,16)
。
下一个数是13,比16小,根据规则1,我们可以把区间从[0,16)
扩展到[0,29)
。
下一个数是43,比29大,根据规则2,添加29,把区间从[0,29)
扩大到[0,58)
。
由于43比58小,根据规则1,可以把区间从[0,58)
扩展到[0,101)
,刚好覆盖了[1,100]
内的所有数。
最终结果是添加2个数,8和29,就可以组合出[1,100]
内的所有整数。
————————————————
版权声明:本文为CSDN博主「Code_Granker」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/happyaaaaaaaaaaa/article/details/50899547
原文地址:https://www.cnblogs.com/wentiliangkaihua/p/11595476.html
- 微信快速开发框架(七)--发送客服信息,版本更新至V2.2 代码已更新至github
- 微信快速开发框架(八)-- V2.3--增加语音识别及网页获取用户信息,代码已更新至Github
- 微信公众平台快速开发框架 For Core 2.0 beta –JCSoft.WX.Core 5.2.0 beta发布
- Android系统层Watchdog机制源码分析
- 算法之插入排序
- Android Studio环境下搭建ReactNative
- Android实现两个ScrollView互相联动,同步滚动的效果
- 一个可以拖动的自定义Gridview代码
- android图片加载库Glide
- 密码最短长度为7,其中必须包含以下非字母数字字符1 完美解决方案
- android开发性能分析
- url带中文参数显示乱码的问题
- 转换程序的一些问题:设置为 OFF 时,不能为表 'Test' 中的标识列插入显式值。8cad0260
- JQuery 对控件的事件操作
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JeecgCloud版,新建项目。
- MySQL忘记root密码,错误号码1045解决办法
- java_流程控制语句、权限修饰符
- [Oracle 故障处理]记一次RMAN备份警告的处理过程
- [Oracle 日常管理]使用oradebug捕获SQL语句
- [Oracle 日常管理]ERRORSTACK使用介绍
- Oracle参数解析(nls_numeric_characters)
- 在Linux系统中安装Tomcat
- java_缓冲流、转换流、序列化流
- Kali内网使用正向shell入侵
- KALI拿到shell后提权操作
- KALI 内网渗透记录
- CentOS7部署Grafana
- CentOS7网卡配置文件详解
- 基于docker搭建jenkins