Leetcode.330 按要求补齐数组

题目链接

Leetcode.330 按要求补齐数组 hard

题目描述

给定一个已排序的正整数数组 n u m s nums nums ,和一个正整数 n n n 。从 [ 1 , n ] [1, n] [1,n] 区间内选取任意个数字补充到 n u m s nums nums 中,使得 [ 1 , n ] [1, n] [1,n] 区间内的任何数字都可以用 n u m s nums 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

提示:
  • 1 ≤ n u m s . l e n g t h ≤ 1000 1 \leq nums.length \leq 1000 1nums.length1000
  • 1 ≤ n u m s [ i ] ≤ 1 0 4 1 \leq nums[i] \leq 10^4 1nums[i]104
  • n u m s nums nums升序排列
  • 1 ≤ n ≤ 2 31 − 1 1 \leq n \leq 2^{31} - 1 1n2311

解法:

假设已经覆盖区间 [ 1 , s − 1 ] [1,s-1] [1,s1] ,当前 n u m s nums nums 的数是 x x x

  • 如果 x ≤ s x \leq s xs,说明 x x x已经覆盖的区间 [ 1 , s − 1 ] [1,s-1] [1,s1] 范围内,所以被覆盖的区间直接扩充为 [ 1 , s − 1 + x ] [1,s - 1 + x] [1,s1+x]接着我们再把 s s s 更新为 s + x s + x s+x,最终被覆盖的范围转变为 [ 1 , s − 1 ] [1,s-1] [1,s1]
  • 如果 x > s x > s x>s,说明 x x x 不在已经覆盖的区间 [ 1 , s − 1 ] [1,s-1] [1,s1] 范围内,我们可以添加一个 不大于 s s s 的数,使得 s s s 被覆盖,操作次数 + 1 + 1 +1但是由于我们要求的是最少的操作次数,所以我们应该添加一个尽可能大的数,这样会使得被覆盖的区间增大,这样的添加操作就会变少。 所以这里选择直接添加 s s s,那么被覆盖的区间范围就变为 [ 1 , 2 s − 1 ] [1,2s - 1] [1,2s1],接着我们再把 s s s 更新为 2 s − 1 2s - 1 2s1,最终被覆盖的范围转变为 [ 1 , s − 1 ] [1,s-1] [1,s1]

注意:

  • 初始时 s = 1 s = 1 s=1,表示没有区间被覆盖了;
  • s ≤ n s \leq n sn 时,我们一直进行上述的操作。当 s > n s > n s>n 时,说明已经覆盖完 [ 1 , n ] [1,n] [1,n] 的区间,此时返回操作次数即可。

时间复杂度: O ( n ) O(n) O(n)

C++代码:

using LL = long long;class Solution {
public:int minPatches(vector<int>& nums, int k) {int ans = 0 , n = nums.size() , i = 0;LL s = 1;while(s <= k){if(i < n && nums[i] <= s){s += nums[i];i++;}else{s *= 2;ans++;}}return ans;}
};

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

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

相关文章

CAN 一: CAN基础知识介绍

1、CAN介绍 1.1、什么是CAN? (1)CAN&#xff08;Controller Area Network:控制器局域网&#xff09;&#xff0c;是ISO国际标准化的串行通信协议。为满足汽车产业的“减少线束的数量”、“通过多个LAN&#xff0c;进行大量数据的高速通信”的需求。 (2)CAN总线的发展历史&a…

纯代码wordpress主题禁止复制粘贴文章内容的方法

很多站长&#xff0c;尤其是新手站长&#xff0c;通常都是内容的搬运工&#xff0c;那我们如何来扼制这些复制他人网站内容且不保留转载链接和署名这种不道德行为&#xff0c;那我们可以通过代码禁用在网站左右复制或是右健功能&#xff0c; 今天大挖就来给大家说说在wordpress…

【LeetCode】每日一题 2023_12_2 拼车(模拟/差分)

文章目录 刷题前唠嗑题目&#xff1a;拼车题目描述代码与解题思路学习大佬题解 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;拼车 题目链接&#xff1a;1094. 拼车 题目描述 代码与解题思路 func carPooling(trips [][]int…

【Linux】第二十四站:模拟实现C语言文件标准库

文章目录 一、实现细节1.需要实现的函数2.fopen的实现3.fclose4.fwrite5.测试6.缓冲区的实现7.FILE中缓冲区的意义 二、完整代码 一、实现细节 1.需要实现的函数 #include "mystdio.h"int main() {_FILE* fp _fopen("test.txt","w");if(fp N…

超大规模集成电路设计----基本概念(二)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----基本概念&#xff08;二&#xff09; 简短的历史回顾(A Brief Historical Perspective)第…

观察者设计模式

package com.jmj.pattern.observer;/*抽象观察者类*/ public interface Observer {void update(String message);}package com.jmj.pattern.observer;/*** 抽象主题角色*/ public interface Subject {//添加观察者对象void attach(Observer observer);//删除订阅者void detach(…

LeetCode(51)简化路径【栈】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 简化路径 1.题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff…

SmartSoftHelp8,FrameCode极速二次开发框架源码

1.winform outlook style UI C/S 极速开发框架 netframework 2.0 2.winform toolbar style UI C/S 极速开发框架 netframework 2.0 3.WPF toolbar style UI C/S 极速开发框架 netframework 4.0 4.Xadmin-UI jquery B/S 极速开发框架 5.Vue element UI B/S…

Presto基础学习--学习笔记

1&#xff0c;Presto背景 2011年&#xff0c;FaceBook的数据仓库存储在少量大型hadoop/hdfs集群&#xff0c;在这之前&#xff0c;FaceBook的科学家和分析师一直靠hive进行数据分析&#xff0c;但hive使用MR作为底层计算框架&#xff0c;是专为批处理设计的&#xff0c;但是随…

在vue3项目嵌套 导入老项目 jQuery项目,减少重复开发

背景&#xff1a; 公司管理平台项目一直是前辈用jQuery做的&#xff0c;为扩展根据自身的技术栈&#xff0c;将jQuery的老项目嵌套入vue3的框架&#xff0c;新功能用vue开发&#xff0c;旧的功能不动直接在vue3用iframe容器来展示 嵌套步骤 2种方式嵌套&#xff0c;一个是已…

微机原理——并行接口8255学习1

目录 并行接口特点 可编程并行接口芯片8255 8255端口地址 8255的三种工作方式 8255的两种命令&#xff08;方式命令和C端口命令&#xff09; 由用户扩展的并行接口8255的应用 声光报警器接口设计 步进电机控制接口设计 PA端口实现跑马灯 PB端口实现按键输入 并行接口特…

同旺科技 USB TO SPI / I2C --- 调试W5500_Ping测试

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 设置寄存器&#xff1a; SHAR&#xff08;源MAC地址寄存器&#xff09;&#xff0c;该寄存器用来设置源MAC…

【预计IEEE出版|EI征稿通知】第六届下一代数据驱动网络国际学术会议 (NGDN 2024)

第六届下一代数据驱动网络国际学术会议 (NGDN 2024) The Sixth International Conference on Next Generation Data-driven Networks 2024年4月26-28日 | 中国沈阳 基于前几届在英国埃克塞特 (ISPA 2020) 、中国沈阳 (TrustCom 2021) 和中国武汉 (IEEETrustCom-2022) 成功举…

如何查看Microsoft Office 使用期限

1.进入到 Office 软件的安装目录&#xff08;******\Microsoft Office\Office&#xff09; ## 以管理员身份打开 Windows PowerShell输入以下命令&#xff0c;回车 cscript ospp.vbs /dstatusREMAINING GRACE 一行表示激活剩余天数&#xff08;括号内是换算成的剩余分钟数…

Android实验:绑定service实验

目录 实验目的实验内容实验要求项目结构代码实现代码解释结果展示 实验目的 充分理解Service的作用&#xff0c;与Activity之间的区别&#xff0c;掌握Service的生命周期以及对应函数&#xff0c;了解Service的主线程性质&#xff1b;掌握主线程的界面刷新的设计原则&#xff…

文心一言 VS 讯飞星火 VS chatgpt (148)-- 算法导论12.2 3题

三、用go语言&#xff0c;写出过程 TREE-PREDECESSOR 的伪代码。 文心一言&#xff1a; 以下是使用Go语言编写的TREE-PREDECESSOR函数的伪代码&#xff1a; func TREE-PREDECESSOR(node) { if node.parent ! nil { return node.parent } // 如果节点是根节点&#xff0c…

Centos图形化界面封装OpenStack Ubuntu镜像

目录 背景 环境 搭建kvm环境 安装ubuntu虚机 虚机设置 系统安装 登录虚机 安装cloud-init 安装cloud-utils-growpart 关闭实例 删除细节信息 删除网卡细节 使虚机脱离libvirt纳管 结束与验证 压缩与转移 验证是否能够正常运行 背景 一般的镜像文件在上传OpenSt…

第 374 场 LeetCode 周赛题解

A 找出峰值 枚举 class Solution { public:vector<int> findPeaks(vector<int> &mountain) {int n mountain.size();vector<int> res;for (int i 1; i < n - 1; i)if (mountain[i] > mountain[i - 1] && mountain[i] > mountain[i 1…

135. 分发糖果

常数空间的那个方法我没看懂 使用贪心算法 根据题目要求&#xff0c;相邻两个孩子评分更高的孩子会获得更多的糖果 也就相当于左规则要求这个孩子比他左边的孩子获得更多糖果&#xff0c;右规则要求这个孩子比他右边的孩子获得更多糖果&#xff0c;在做有规则均满足时&#xff…

结构体排序

结构体排序 #include <iostream> #include <algorithm> #include <string> using namespace std;//结构体排序一 ----定义cmp函数 //按姓名从小到大排序&#xff0c;姓名一样&#xff0c;按年龄从小到大排序 struct student{string name; int age; }; bo…