找到和为给定整数的三个连续整数

标签: 数学 模拟

难度: Medium

给你一个整数 num ,请你返回三个连续的整数,它们的  为 num 。如果 num 无法被表示成三个连续整数的和,请你返回一个  数组。

示例 1:

输入:num = 33
输出:[10,11,12]
解释:33 可以表示为 10 + 11 + 12 = 33 。
10, 11, 12 是 3 个连续整数,所以返回 [10, 11, 12] 。

示例 2:

输入:num = 4
输出:[]
解释:没有办法将 4 表示成 3 个连续整数的和。

提示:

  • 0 <= num <= 1015

Submission

运行时间: 23 ms

内存: 16.0 MB

from typing import List

class Solution:
    def sumOfThree(self, num: int) -> List[int]:
        if num % 3 != 0:
            return []  # 如果 num 无法被 3 整除,直接返回空数组

        # 找到一个起始点,从该点开始的三个连续整数的和为 num
        start = num // 3 - 1
        return [start, start + 1, start + 2]

# 示例测试
solution = Solution()
print(solution.sumOfThree(33))  # 输出: [10, 11, 12]
print(solution.sumOfThree(4))   # 输出: []

Explain

这个题解的思路是首先检查给定的整数 num 是否能被 3 整除。这是因为任意三个连续整数的和必定是 3 的倍数,具体来说,如果三个连续整数分别是 x, x+1, x+2,那么它们的和是 3x+3,即 3(x+1)。因此,如果 num 不能被 3 整除,那么 num 无法被表示为三个连续整数的和。如果 num 可以被 3 整除,通过计算 num // 3 - 1 可以得到 x 的值,进而得到三个连续整数 x, x+1, x+2。

时间复杂度: O(1)

空间复杂度: O(1)

from typing import List

class Solution:
    def sumOfThree(self, num: int) -> List[int]:
        # 检查 num 是否能被3整除
        if num % 3 != 0:
            return []  # 如果不是,返回空数组

        # 计算连续整数的起始值
        start = num // 3 - 1  # 起始整数
        return [start, start + 1, start + 2]  # 返回三个连续整数

# 示例测试
solution = Solution()
print(solution.sumOfThree(33))  # 输出: [10, 11, 12]
print(solution.sumOfThree(4))   # 输出: []

Explore

对于三个连续整数 x, x+1, x+2,其和可以表示为 x + (x + 1) + (x + 2) = 3x + 3。这个表达式可以被重写为 3(x + 1),因为这里的 x + 1 实际上是这三个数的中间值。使用这种形式可以更直观地看出和的三倍性,并简化计算。

在Python中,int类型是可以自动扩展为长整型的,这意味着它可以处理远超常规整数范围的数值。因此,即便 num 接近于 10^15,使用 int 型变量进行计算通常不会有溢出的风险。

如果 num 等于 0,根据算法,计算得到的起始整数 x 会是 0 // 3 - 1 = -1,因此输出的三个连续整数是 [-1, 0, 1]。这种输出是合理的,因为这三个数的和确实为 0,符合题目要求。

选择 'num // 3 - 1' 作为起始点是因为这使得三个连续整数的中间值为 'num // 3',从而保证三个数的和等于 num。从数学角度来看,这是解决方程 3x+3 = num 的唯一解,因此不存在其他可能的开始点。