当前位置: 首页 > 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) // 2
        
        half_k = k // 2
        chosen_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_count
        start = k
        end = k + remaining_count - 1
        remaining_sum = (start + end) * remaining_count // 2
        
        return 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 = 1
        
        while len(s) < n:
            if k - num not in s:
                s.add(num)
            num += 1
        
        return 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.dtcms.com/a/93853.html

相关文章:

  • HCIP(TCP)(2)
  • macOS 制作dmg磁盘映像安装包
  • SSL/TLS加密
  • vue 中渲染 markdown 格式的文本
  • RTOS实现Try-Catch机制,支持CM3/4/7
  • 【R语言可视化】相关系数热图
  • RAGFlow如何迁移到新机器
  • 批量提取 PPT 文档幻灯片中的备注到单独的文件
  • 26考研——栈、队列和数组_队列(3)
  • 前端知识点---用正则表达式判断邮箱(javascript)
  • langgraph的使用
  • TypeScript 与 JavaScript 对比
  • 雪花算法生成分布式唯一ID
  • (UI自动化测试web端)第二篇:元素定位的方法_css定位之层级选择器
  • LangChain4j与DashScope深度集成实战:一站式开发指南
  • 当 0 编程基础,用 ChatGPT 和 Cursor 开发同一应用时… |AI 开发初体验
  • mysqloracledb2 (uuid函数)
  • 23种设计模式-中介者(Mediator)设计模式
  • lua面向对象
  • Couchbase存储引擎Magma和Couchstore
  • 鸿蒙开发之ArkTS联合类型
  • Kafka 4.0 发布:KRaft 替代 Zookeeper、新一代重平衡协议、点对点消息模型、移除旧协议 API
  • Java排序
  • 输出文字的综合使用例子
  • 本地部署仓库管理工具 Gitlab 并实现外部访问
  • 从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.2.2文本生成逻辑:Top-k采样与温度控制
  • 级联FFT(超采样FFT架构)的MATLAB代码及原理
  • 前端技巧第十期JavaScript作用域链
  • 【银河麒麟系统常识】命令:dotnet --list-sdks(列出已安装的 .NET SDK 版本)
  • matlab打开两个工程