2177. 找到和为给定整数的三个连续整数
题目描述
给你一个整数 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
解法
方法一:数学
我们假设三个连续的整数分别为 $x-1$, $x$, $x+1$,则它们的和为 $3x$,因此 $\textit{num}$ 必须是 $3$ 的倍数。如果 $\textit{num}$ 不是 $3$ 的倍数,则无法表示成三个连续整数的和,返回空数组。否则,令 $x = \frac{\textit{num}}{3}$,则 $x-1$, $x$, $x+1$ 就是三个连续整数,它们的和为 $\textit{num}$。
时间复杂度 $O(1)$,空间复杂度 $O(1)$。
Python3
class Solution:
def sumOfThree(self, num: int) -> List[int]:
x, mod = divmod(num, 3)
return [] if mod else [x - 1, x, x + 1]
Java
class Solution {
public long[] sumOfThree(long num) {
if (num % 3 != 0) {
return new long[] {};
}
long x = num / 3;
return new long[] {x - 1, x, x + 1};
}
}
C++
class Solution {
public:
vector<long long> sumOfThree(long long num) {
if (num % 3) {
return {};
}
long long x = num / 3;
return {x - 1, x, x + 1};
}
};
Go
func sumOfThree(num int64) []int64 {
if num%3 != 0 {
return []int64{}
}
x := num / 3
return []int64{x - 1, x, x + 1}
}
TypeScript
function sumOfThree(num: number): number[] {
if (num % 3) {
return [];
}
const x = Math.floor(num / 3);
return [x - 1, x, x + 1];
}
Rust
impl Solution {
pub fn sum_of_three(num: i64) -> Vec<i64> {
if num % 3 != 0 {
return Vec::new();
}
let x = num / 3;
vec![x - 1, x, x + 1]
}
}
JavaScript
/**
* @param {number} num
* @return {number[]}
*/
var sumOfThree = function (num) {
if (num % 3) {
return [];
}
const x = Math.floor(num / 3);
return [x - 1, x, x + 1];
};