力扣第 283 场周赛 :向数组中追加 K 个整数

简介: 给你一个整数数组 nums 和一个整数 k 。

5.png

一、问题描述


给你一个整数数组 nums 和一个整数 k 。请你向 nums 中追加 k 出现在 nums 中的、互不相同 整数,并使结果数组的元素和 最小

返回追加到 nums 中的 k 个整数之和。


题目链接:向数组中追加 K 个整数

二、题目要求

样例

输入:nums= [1,4,25,10,25], k=2输出:5解释:在该解法中,向数组中追加的两个互不相同且未出现的正整数是23nums最终元素和为1+4+25+10+25+2+3=70,这是所有情况中的最小值。所以追加到数组中的两个整数之和是2+3=5,所以返回5


考察

动态模拟
建议用时20~40min


三、问题分析


一开始我是什么思路呢,就以样例为例,我先把样例从小到大排序:

1 4 10 25 25

要求追加最小的数字,我就从一开始判断假如第一个数字为5,那么前面插入的优先顺序可以为1 2 3 4。样例的第一个数字是1,那我们就看1~ 4中间插入,还不满足 4~10中间插入......

到了最后如果还不满足,只能选取25之后的数字插入,直到满足条件,这个方法我觉得还是比较巧妙的,但提交超时了。

16.png

于是开启漫长的优化之路,思想还是上面的思想,但其实插入的数字和直接换成等差数列求和就优化成功了。

比如1~4中间有23两个数字,k=10,需要23,k=84~10中间有56789四个数字,需要56789,k=310~25中间有14个数字,但只需要111213这三个,k=0,退出


四、编码实现


classSolution {
public:
longlongminimalKSum(vector<int>&nums, intk) {
longlonginti,ans=0,sum=0,n=nums.size(),count,start,end;//初始化sort(nums.begin(),nums.end());//从小到大排序if(nums[i]>1)//第一个数字        {
start=1,end=nums[i]-1;//首位1,末位count=end-start+1;//中间数字的个数if(count>=k)//比需求的k还多            {
sum+=(start+start+k-1)*k/2;//只需要k个returnsum;
            }
elsesum+=(start+end)*count/2;//比需求的少,全部都要k-=count;
        } 
for(i=0;i<n-1;i++)//中间部分,两两组合        {
if(k==0)//退出循环条件            {
returnsum;
            }
if(nums[i+1]>nums[i])//中间有空            {
start=nums[i]+1,end=nums[i+1]-1;
count=end-start+1;
if(count>=k)
                {
sum+=(start+start+k-1)*k/2;//只需要k个returnsum;
                }
elsesum+=(start+end)*count/2;//比需求的少,全部都要k-=count;
             }  
        }
start=nums[n-1]+1;//最后一个数字sum+=(start+start+k-1)*k/2;//向后拓展returnsum;//返回结果    }  
};

五、测试结果15.png

相关文章
|
4天前
|
算法
LeetCode第53题最大子数组和
LeetCode第53题"最大子数组和"的解题方法,利用动态规划思想,通过一次遍历数组,维护到当前元素为止的最大子数组和,有效避免了复杂度更高的暴力解法。
LeetCode第53题最大子数组和
|
5天前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
LeetCode------找到所有数组中消失的数字(6)【数组】
这篇文章介绍了LeetCode上的"找到所有数组中消失的数字"问题,提供了一种解法,通过两次遍历来找出所有未在数组中出现的数字:第一次遍历将数组中的每个数字对应位置的值增加数组长度,第二次遍历找出所有未被增加的数字,即缺失的数字。
|
5天前
|
前端开发
LeetCode------移动零(5)【数组】
这篇文章介绍了LeetCode上的"移动零"问题,提出了一种使用双指针的原地操作解法,该方法首先将非零元素移动到数组前端并保持相对顺序,然后填充后续位置为零,以达到题目要求。
|
4天前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
4天前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
4天前
|
算法
LeetCode第33题搜索旋转排序数组
这篇文章介绍了LeetCode第33题"搜索旋转排序数组"的解题方法,通过使用二分查找法并根据数组的有序性质调整搜索范围,实现了时间复杂度为O(log n)的高效搜索算法。
LeetCode第33题搜索旋转排序数组
|
4天前
|
算法
LeetCode第12题目整数转罗马数字
该文章介绍了 LeetCode 第 12 题整数转罗马数字的解法,通过使用 TreeMap 按照整数从大到小排序,先使用大的罗马数字表示整数,再用小的,核心是先表示完大的罗马数字,想通此点该题较简单。
LeetCode第12题目整数转罗马数字
|
4天前
|
算法
LeetCode第8题字符串转换整数 (atoi)
该文章介绍了 LeetCode 第 8 题字符串转换整数 (atoi)的解法,需要对字符串进行格式解析与校验,去除前导空格和处理正负号,通过从高位到低位的计算方式将字符串转换为整数,并处理越界情况。同时总结了这几道题都需要对数字的表示有理解。
LeetCode第8题字符串转换整数 (atoi)
|
4天前
|
算法
LeetCode第7题整数反转
该文章介绍了 LeetCode 第 7 题整数反转的解法,通过除 10 取模和乘 10 累加的方式实现整数反转,同时注意边界情况的判断,并总结了通过举例推算发现规律的解题思路。
LeetCode第7题整数反转