当前位置: 首页 > news >正文

每日一题-力扣-2829. k-avoiding 数组的最小总和 0326

在这里插入图片描述

解决"k-avoiding 数组的最小总和"问题

这道题有两种主要解法。

解法一:直接数学计算(最优解)

通过数学推导直接计算出结果,不需要构建实际的数组。

class Solution:def minimumSum(self, n: int, k: int) -> int:# 特殊情况:当k很大或k=1时,可以直接选择前n个正整数if k > 2*n or k <= 1:return n * (n + 1) // 2half_k = k // 2chosen_count = min(n, half_k)# 计算前half_k个数的和first_sum = chosen_count * (chosen_count + 1) // 2# 如果已经选择了n个数,直接返回结果if chosen_count == n:return first_sum# 否则,计算从k开始的剩余数字的和remaining_count = n - chosen_countstart = kend = k + remaining_count - 1remaining_sum = (start + end) * remaining_count // 2return first_sum + remaining_sum

思路解析:

  1. 需要找到n个不同的正整数,使得没有两个数的和等于k,且总和最小。
  2. 为了最小化总和,总是尝试包含尽可能小的正整数。
  3. 对于任何一个数x,不能同时包含x和k-x(否则它们的和就是k)。
  4. 当x < k/2时,x < k-x,所以为了最小化总和,应该选择x而不是k-x。
  5. 因此,可以安全地包含1到k/2的所有数。
  6. 对于k/2 < x < k的数,它们的互补数k-x已经在选择的集合中(因为k-x < k/2),所以必须跳过这些数。
  7. 对于x ≥ k的数,它们的互补数k-x ≤ 0,不在正整数集合中,所以可以安全包含。

时间复杂度:O(1),只需要进行简单的数学计算。
空间复杂度:O(1),只使用常数空间。

解法二:贪心方法 + 集合

通过维护一个集合,贪心地选择最小的可行数字:

class Solution:def minimumSum(self, n: int, k: int) -> int:s = set()num = 1while len(s) < n:if k - num not in s:s.add(num)num += 1return sum(s)

思路解析:

  1. 维护一个已选择数字的集合s。
  2. 从1开始,尝试将每个数字加入序列。
  3. 对于每个数字num,检查其互补数(k-num)是否已在集合中。如果不在,则可以加入num。
  4. 继续此过程直到集合中有n个数字。

时间复杂度:O(n),最多需要检查2n个数字。
空间复杂度:O(n),需要存储n个数字。

示例分析

以示例1为例,n=5, k=4:

  • 解法一中,half_k = 2,首先选择1和2。
  • 然后跳过3(因为4-3=1,而1已经在集合中)。
  • 然后从4开始选择剩余的数字:4,5,6。
  • 最终序列是[1,2,4,5,6],总和为18。

两种解法都能得到正确结果,但第一种解法更高效,时间复杂度为常数级。


http://www.mrgr.cn/news/96134.html

相关文章:

  • gz sim机器人SDF模型 [持续更新]
  • [unity 点击事件] 区域响应点击事件,排除子节点区域,Raycast Target 应用
  • Android实践开发制作小猴子摘桃小游戏
  • 系统架构设计知识体系总结
  • 在 Linux(Ubuntu / CentOS 7)上快速搭建我的世界 MineCraft 服务器,并实现远程联机,详细教程
  • 给Web开发者的HarmonyOS指南01-文本样式
  • 数学-算法
  • Unity-RectTransform设置UI width
  • 生成模型速通(Diffusion,VAE,GAN)
  • 【更新中】【React】基础版React + Redux实现教程,自定义redux库和react-redux库
  • Mac 常用命令
  • @Resource 与 @Autowired:Spring 中的依赖注入注解大比拼
  • 前端全局编程和模块化编程
  • Android面试之基础算法总结
  • 01 设计模式和设计原则
  • MyBatis-Plus(SpringBoot版)学习第一讲:简介入门案例
  • vue vue3 走马灯Carousel
  • 高性能 Android 自定义 View:数据渲染与事件分发的双重优化
  • QT三 自定义控件,自定义控件的事件处理自定义事件过滤,原始事件过滤
  • 自动化测试selenium(Java版)