当前位置: 首页 > 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。

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

相关文章:

  • 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
  • logo图片大全简单/淮北seo
  • 纯净水企业怎样做网站/seo排名app
  • 附近哪里有建筑模板卖/2020站群seo系统
  • 优秀北京网站建设/网站seo优化技能
  • 做淘宝网站怎么弄的/武汉seo排名优化公司
  • 宜春做网站公司怎么样/网站设计与开发