面试题57 - II
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
限制:
1 <= target <= 10^5
Solutions
math
Similar to
problem 829
. Check it for detailed explanation.
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
target--;
int num = 2;
vector<vector<int>> res;
while (target >= num) {
if (target % num == 0) {
vector<int> arr(num, target / num);
for (int i = 0; i < num; i++)
arr[i] += i;
res.push_back(move(arr));
}
target -= num;
num++;
}
reverse(res.begin(), res.end());
return res;
}
};
Or
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
int num = 2, n = 2 * target;
vector<vector<int>> res;
while (num * num < n) {
if (n % num == 0 && (n / num - num) % 2 == 1) {
vector<int> arr(num, (n / num - num + 1) / 2);
for (int i = 0; i < num; i++)
arr[i] += i;
res.push_back(move(arr));
}
num++;
}
reverse(res.begin(), res.end());
return res;
}
};
Last updated
Was this helpful?