leetcode330. 按要求补齐数组 顶级难度玄学贪心

给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。

示例 1:

输入: nums = [1,3], n = 6
输出: 1 
解释:
根据 nums 里现有的组合 [1], [3], [1,3],可以得出 1, 3, 4。
现在如果我们将 2 添加到 nums 中, 组合变为: [1], [2], [3], [1,3], [2,3], [1,2,3]。
其和可以表示数字 1, 2, 3, 4, 5, 6,能够覆盖 [1, 6] 区间里所有的数。
所以我们最少需要添加一个数字。
示例 2:

输入: nums = [1,5,10], n = 20
输出: 2
解释: 我们需要添加 [2, 4]。
示例 3:

输入: nums = [1,2,2], n = 5
输出: 0

思路:这题算是挺著名的贪心题了,想出办法来很难知道对不对,不会证明,只能先试试能不能过。

设miss是当前能组成1-------miss间的数字。

1)对于遇到的新数字nums[i],如果它小于miss,那么我们可以组成1-----miss+nums[i]之间的所有数(这没什么可想的)

2)对于遇到的新数字nums[i],如果它大于miss,这时我们能做的最优解应该是添加一个miss数字本身,

使我们的范围变为1------2*miss。

对于第二点的策略,其实不难猜出来,因为对于多重背包问题(每种物品数量不确定),我们就可以用二进制拆分物品来优化,因为15=1+2+4+8=1111,这四个二进制位就可以表示1----15所有的数字

public class Solution {public int minPatches(int[] nums, int n) {int patches = 0, i = 0;long miss = 1;while (miss <= n) {if (i < nums.length && nums[i] <= miss){miss += nums[i];i++;}else {miss += miss;patches++;}}return patches;}
}

我做这道题时就想起了之前做背包时拆分的二进制,虽然那不是最优解(最优解是单调队列配合的背包),但是对于这道题是很有帮助的。

具体介绍可以看我之前的文章:

动态规划入门到熟悉,看不懂来打我啊

 

证明策略正确:

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

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

相关文章

C:02---scanf、printf

一、printf 控制符 ①精度控制:输入小数点后m位(%.mf)。右对齐5位,保留小数点后m位(%d.mf)%f、%lf默认输出6位小数②宽度:%md(打印m为,右对齐,多出m位照常打印)。%-md(打印m位,左对齐,多出m位照常打印)③长度:h表示短(打印短整型short:%hd),l表示长(打印长…

C++:20---成员变量初始化方式

成员变量初始化有三种方式: 在构造函数体内赋值初始化在自定义的公有函数体中赋值初始化(一般用于成员变量的初始化)在构造函数的成员初始化列表初始化一、构造函数体内初始化 说明:在构造函数体内的初始化方式,本质是是为成员变量赋值,而不是真正意义上的初始化,这点要…

leetcode339. 嵌套列表权重和

给定一个嵌套的整数列表&#xff0c;请返回该列表按深度加权后所有整数的总和。 每个元素要么是整数&#xff0c;要么是列表。同时&#xff0c;列表中元素同样也可以是整数或者是另一个列表。 示例 1: 输入: [[1,1],2,[1,1]] 输出: 10 解释: 因为列表中有四个深度为 2 的 1…

C++:19---this指针

一、this指针介绍 概念:this指针是成员函数的一个隐式参数,在类中本质上就是对象的指针(常量指针)特点:在成员函数中可通过this指针区别成员变量与形参变量this可以显式调用示例代码:class Cperson{private:int age;float height;public:void InitPerson(int age,float hei…

leetcode346. 数据流中的移动平均值

给定一个整数数据流和一个窗口大小&#xff0c;根据该滑动窗口的大小&#xff0c;计算其所有整数的移动平均值。 示例: MovingAverage m new MovingAverage(3); m.next(1) 1 m.next(10) (1 10) / 2 m.next(3) (1 10 3) / 3 m.next(5) (10 3 5) / 3 思路&#xff1…

(二十)TCPIP面试宝典-进入大厂必备总结(中)

TCP 作为传输层的协议,是一个IT工程师素养的体现,也是面试中经常被问到的知识点。在此,我将 TCP 核心的一些问题梳理了一下,希望能帮到各位。 实际上这篇文章相当于是复习之前的网络基础部分。只不过这篇文章的提问方式更灵活,也是让读者们懂得变通,更熟悉TCP。 前两篇文…

leetcode263. 丑数

编写一个程序判断给定的数是否为丑数。 丑数就是只包含质因数 2, 3, 5 的正整数。 示例 1: 输入: 6 输出: true 解释: 6 2 3 示例 2: 输入: 8 输出: true 解释: 8 2 2 2 示例 3: 输入: 14 输出: false 解释: 14 不是丑数&#xff0c;因为它包含了另外一个质因数 7。…

(二十一)TCPIP面试宝典-进入大厂必备总结(下)

TCP 作为传输层的协议,是一个IT工程师素养的体现,也是面试中经常被问到的知识点。在此,我将 TCP 核心的一些问题梳理了一下,希望能帮到各位。 实际上这篇文章相当于是复习之前的网络基础部分。只不过这篇文章的提问方式更灵活,也是让读者们懂得变通,更熟悉TCP。 上一篇文…

C++:23 再议const的用法(下)

上一篇文章折腾了一波粉丝,那么这一篇文章稍微温柔一些。 我主要开始说如何正确使用const 1.不能将const 修饰的任何对象、引用和指针作为赋值表达式的左值。 const int cx=100; const int & rcx=cx; const int * pcx=&cx; cx=200; //error rcx=200; //error *pcx=200…

C++:22 再议const的作用(上)

我在C++:18篇里说过const的用法,这里我有必要再提升进阶下const的理解。 因为你可能只知道他是怎么用的,但是他为什么这样用,其他用法呢? 首先回顾下const有什么主要的作用? (1)可以定义const常量,具有不可变性。 (2)便于进行类型检查,使编译器对处理内容有更多了解…

leetcode57. 插入区间

给出一个无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。 示例 1: 输入: intervals [[1,3],[6,9]], newInterval …

C:03---运算符优先级

二话不说先看运算符的优先级表: 一、逗号运算符 格式:整个逗号表达式的值返回的结果是最后一个表达式的值使用起来,最好加上括号来返回最后一个表达式的值。否则逗号表达式的意义将失效(见下面演示案例)(表达式1, 表达式2, 表达式3....); #include <stdio.h> int ma…

C++: 21---引用和指针

一般说到谁和谁怎么样,要么说两者的相似点,要么两者的区别,这里我们也要说二者的区别和联系,同时,也不仅仅是区别和联系这么简单,因为你可能会发现在变量赋值,函数传参这两点还是有很多值得品一品的。 最直观的赋值方面的区别 首先我们先说二者的区别和联系。 (1)指针…

Oracle数据库Date类型查询问题(

浅谈Oracle数据库Date类型查询问题用过Oracle数据库的朋友应该知道&#xff0c;Oracle数据库在以Date类型为查询条件时存在一个小小的BUG&#xff0c;如&#xff1a;select * from tableName where createDate > to_date(2007-01-01,yyyy-mm-dd) and createDate < to_dat…

(二十二)深入浅出TCPIP之实战篇—用c++开发一个http服务器

在当前的网络编程专栏前十几篇文章里&#xff0c;我已经说明了TCPIP常用的一些原理&#xff0c;那么接下来我将逐步进入到实战编程阶段&#xff1a;本篇文章我将带大家用C做一个http服务器。既然想实现一个http服务器&#xff0c;首先必须要熟悉的就是http协议知识&#xff0c;…

C++:19---重载与模板、模板特例化

一、重载与模板 函数模板可以被另一个模板或一个普通非模板函数重载如果涉及函数模板,则函数匹配规则会有以下的约束:如果同样好的函数中只有一个是非模板函数,则选择此函数如果同样好的函数中没有非模板函数,而有多个函数模板,则其中一个模板比其他模板更特例化,则选择此…

leetcode159. 至多包含两个不同字符的最长子串

给定一个字符串 s &#xff0c;找出 至多 包含两个不同字符的最长子串 t 。 示例 1: 输入: "eceba" 输出: 3 解释: t 是 "ece"&#xff0c;长度为3。 示例 2: 输入: "ccaabbb" 输出: 5 解释: t 是 "aabbb"&#xff0c;长度为5。 思…

C++:17---函数指针

一、格式 指针名前*号,并且将*和指针名用括号括起来例如: //指针名为pf,指向一个返回值为bool,参数为两个const string&的函数 bool (*pf)(const string&, const string&); //这个不是函数指针,而是一个返回值为bool*的pf函数 bool *pf(const string&, co…

leetcode161. 相隔为 1 的编辑距离

给定两个字符串 s 和 t&#xff0c;判断他们的编辑距离是否为 1。 注意&#xff1a; 满足编辑距离等于 1 有三种可能的情形&#xff1a; 往 s 中插入一个字符得到 t 从 s 中删除一个字符得到 t 在 s 中替换一个字符得到 t 示例 1&#xff1a; 输入: s "ab", t …

C语言-- 大端小端详解

一、什么是大端和小端 所谓的大端模式,就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 所谓的小端模式,就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 简单来说:大端——高尾端,小端——低尾端 举个例子,比如数字 0x12 34 56 78…