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 <= 10^15
提示:
- 注意如果存在解,我们可以将它们表示为 x-1, x, x+1。这告诉我们关于这个数字的什么信息?
- 注意数字的和将是 3x。你能求解 x 吗?
解题思路
这是一道数学题,核心思路是利用连续整数的性质。
设三个连续整数为 x-1, x, x+1,那么它们的和为:
(x-1) + x + (x+1) = 3x = num
因此,x = num / 3。
关键观察:
- 如果
num能被 3 整除,那么x = num / 3是整数,三个连续整数为[x-1, x, x+1] - 如果
num不能被 3 整除,则不存在三个连续整数的和等于num
算法步骤:
- 检查
num是否能被 3 整除 - 如果能整除,计算中间数
x = num / 3 - 返回
[x-1, x, x+1] - 如果不能整除,返回空数组
时间复杂度分析: O(1) - 只需要常数时间的除法和判断操作 空间复杂度分析: O(1) - 只使用常数额外空间
代码实现
class Solution {
public:
vector<long long> sumOfThree(long long num) {
if (num % 3 != 0) {
return {};
}
long long x = num / 3;
return {x - 1, x, x + 1};
}
};
class Solution:
def sumOfThree(self, num: int) -> List[int]:
if num % 3 != 0:
return []
x = num // 3
return [x - 1, x, x + 1]
public class Solution {
public long[] SumOfThree(long num) {
if (num % 3 != 0) {
return new long[0];
}
long x = num / 3;
return new long[] {x - 1, x, x + 1};
}
}
var sumOfThree = function(num) {
if (num % 3 !== 0) {
return [];
}
const x = Math.floor(num / 3);
return [x - 1, x, x + 1];
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(1) | 只需要常数时间的除法和取模操作 |
| 空间复杂度 | O(1) | 只使用常数额外空间,返回数组不计入空间复杂度 |
相关题目
. Longest Consecutive Sequence (Medium)