leetcode每日一题:k-avoiding 数组的最小总和

引言
今天是本次开始坚持leetcode每日1题的第10天,也算是迈出了一小步。
题目
给你两个整数 n 和 k 。
对于一个由 不同 正整数组成的数组,如果其中不存在任何求和等于 k 的不同元素对,则称其为 k-avoiding 数组。
返回长度为 n 的 k-avoiding 数组的可能的最小总和。
示例 1:
输入:n = 5, k = 4
输出:18
解释:设若 k-avoiding 数组为 [1,2,4,5,6] ,其元素总和为 18 。
可以证明不存在总和小于 18 的 k-avoiding 数组。
示例 2:
输入:n = 2, k = 6
输出:3
解释:可以构造数组 [1,2] ,其元素总和为 3 。
可以证明不存在总和小于 3 的 k-avoiding 数组。
提示:
1 <= n, k <= 50
思路
还是先读懂题目,要求不存在任何求和等于 k 的不同元素对,所以,如何我们在数组中选择了数字t,就不能包含k-t。贪心的,我们让数组中线包含1、2、3这样较小的数,但是不包含k-t。这样,在数组中,我们最多能有k/2个数。这时会产生2种情况:
n <= k/2,此时我们只要构造[1, n]这样一个包含n个数字的数组即可,直接使用高斯求和就可以n > k/2,此时,我们构造了[1, k/2]这个数组后,还不足n个,我们还需要补充n-k/2个数字,我们可以从k开始,逐个加入k,k+1,k+2直到补充够n个数字,因为数组中数字都是正整数,此时k-t都是不是正整数,不会出现在这个数组中,不需要考虑任意2个数和等于k的情况。所以,我们这样就构造了[1, k/2]和[k, k + n - k/2 - 1]这2个等差数列
图解

代码

/**
* 如何包含了t,那么就不能包含k-t,所以这2个数中应该尽量取小的那个
* 如果从 1 到 k/2 的数组,还是数量不足n,那么就要从k开始加入,依次加入 k, k+1, k+2... 直到凑满n个数
*/
public int minimumSum(int n, int k) {
if (n <= k / 2) {
return (1 + n) * n / 2;
}
// 先计算 [1, k/2] 数组的和 再计算 [k, k + n - k/2 - 1]的和
return (1 + k / 2) * (k / 2) / 2 + (k + k + n - k/2 - 1) * (n - k / 2) / 2;
}
耗时

leetcode每日一题:k-avoiding 数组的最小总和的更多相关文章
- 【python】Leetcode每日一题-搜索排序数组2
[python]Leetcode每日一题-搜索排序数组2 [题目描述] 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k( ...
- 【python】Leetcode每日一题-删除有序数组中的重复项
[python]Leetcode每日一题-删除有序数组中的重复项 [题目描述] 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现一次 ,返回删除后数组的新长度. 不要 ...
- 【python】Leetcode每日一题-删除有序数组中的重复项2
[python]Leetcode每日一题-删除有序数组中的重复项2 [题目描述] 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不 ...
- 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素
[python]Leetcode每日一题-寻找旋转排序数组中的最小元素 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...
- 【JavaScript】Leetcode每日一题-矩形区域不超过K的最大值和
[JavaScript]Leetcode每日一题-矩形区域不超过K的最大值和 [题目描述] 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大 ...
- [LeetCode每日一题]81. 搜索旋转排序数组 II
[LeetCode每日一题]81. 搜索旋转排序数组 II 问题 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 & ...
- [LeetCode每日一题]80. 删除有序数组中的重复项 II
[LeetCode每日一题]80. 删除有序数组中的重复项 II 问题 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不要使用额外 ...
- 【js】Leetcode每日一题-数组异或操作
[js]Leetcode每日一题-数组异或操作 [题目描述] 给你两个整数,n 和 start . 数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == ...
- 【js】Leetcode每日一题-解码异或后数组
[js]Leetcode每日一题-解码异或后数组 [题目描述] 未知 整数数组 arr 由 n 个非负整数组成. 经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encode ...
- [LeetCode每日一题]153.寻找旋转排序数组中的最小值
[LeetCode每日一题]153.寻找旋转排序数组中的最小值 问题 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1, ...
随机推荐
- CDS标准视图:应收账龄表 I_ARJrnlEntrItmAgingGrid
视图名称:应收账龄表 I_ARJrnlEntrItmAgingGrid 视图类型:参数 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IARJEITMAGGRID' ...
- h5使用vue-photo-preview 做全屏预览
h5页面使用全屏预览 最近需要在微信小程序中跳转到h5页面 在h5页面中需要进行图片预览展示 由于没有使用第三方的组件库. 只能手写,但是时间很紧张. 所以只能够寻找第三方的插件 vue-photo- ...
- 基于生成式AI的访问控制, 迁移传统安全策略到基于LLM的风险分类器
基于规则的风险分类 风险分类是网络安全系统的核心能力之一,它将访问请求和命令映射到其风险级别/类别:高(High).中(Medium).低(Low).目前,即便是在大规模环境中,风险分类器仍主要采用基 ...
- RabbitMq消息过期时间TTL介绍
概述: 在rabbitmq中我们可以给消息设定过期时间LLT(Time to Live),在消息发送后过期时间段内未被消费,则系统会将其删除,被删除的消息将会进入死信队列.关于设置消息的过期时间有两种 ...
- FLink自定义Source,不停生产数据
一.代码模板 VideoOrder.java package net.xdclass.model; import java.util.Date; import lombok.AllArgsConstr ...
- Atcoder ABC342D Square Pair 题解 [ 绿 ] [ 数论 ] [ 唯一分解定理 ]
Square Pair:唯一分解定理好题. 引理 若 \(x=y^2\times z\),且 \(x\) 是完全平方数,那么 \(z\) 也一定是完全平方数. 证明可以用唯一分解定理证,每次把偶数次幂 ...
- .NET Core内存结构体系(Windows环境)底层原理浅谈
物理内存与虚拟内存 物理内存(Physical Memory) 定义:物理内存是计算机硬件中的实际RAM(如DDR5内存条),直接通过总线与CPU连接,用于临时存储运行中的程序和数据. 虚拟内存(Vi ...
- tomcat配置用户名密码
1.配置tomcat-user.xml<role rolename="manager-gui"/><role rolename="manager-scr ...
- Prism 学习(一)
转载自:http://www.cnblogs.com/Clingingboy/archive/2009/01/07/prism_part2.html 本篇将介绍Prism中Region的使用. 本篇D ...
- Vue press 支持图片放大功能的代码分享
介绍 VuePress 由两部分组成:一个以 Vue 驱动的主题系统的简约静态网站生成工具,和一个为编写技术文档而优化的默认主题.它是为了支持 Vue 子项目的文档需求而创建的. 由 VuePress ...