import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
}
}
NC259. 和为S的连续正数序列
描述
输出描述
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序示例1
输入:
9
输出:
[[2,3,4],[4,5]]
示例2
输入:
0
输出:
[]
C++ 解法, 执行用时: 2ms, 内存消耗: 352KB, 提交时间: 2021-03-28
class Solution {public:vector<vector<int> > FindContinuousSequence(int sum) {//子序列和的最大值int End=sum/2+1;int left=1;int right=1;int CurSum=1;vector<vector<int> >res;while(left<=End&&right<=End){if(CurSum==sum){GetVector(res,left,right);right++;CurSum+=right;}else if(CurSum<sum)//增加右边界{right++;CurSum+=right;}else{CurSum-=left;left++;}}return res;}void GetVector(vector<vector<int> >&res,int left,int right){if(left==right){return ;}vector<int>V;for(int i=left;i<=right;i++){V.push_back(i);}res.push_back(V);}};
C++ 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2021-05-28
class Solution {public:vector<vector<int> > FindContinuousSequence(int sum) {//前缀法/*vector<vector<int>> ret;int tmp = 0;for (int i=1; i<=sum/2; ++i) { //sum/2+sum+1 一定大于sum所以没必要列举sum/2之后的序列了for (int j=i; j<sum; ++j) {tmp += j;if (sum == tmp) {vector<int> ans;for (int k=i; k<=j; ++k) ans.push_back(k);ret.push_back(ans);}else if (tmp > sum) {// 提前剪枝tmp = 0;break;}}}return ret; *///窗口滑动法vector<vector<int>> res;int i=1, j=1;int temp=0;while(i<=sum/2){if (temp<sum) {temp +=j;j++;}else if(temp>sum) {temp -=i; i++;}else {vector<int> ans;for(int k=i; k<j;k++){ans.push_back(k);}res.push_back(ans);temp -=i;i++;}}return res;}};
C++ 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2021-05-13
class Solution {public:vector<vector<int> > FindContinuousSequence(int sum) {int win_l = 1, win_r = 1, win_sum = 1;vector<vector<int> > ans;while(win_r <= sum / 2){while(win_sum < sum){win_r++;win_sum += win_r;}while(win_sum >= sum){if(win_sum == sum){ans.push_back(getvec(win_l,win_r));}win_sum = win_sum - win_l;win_l++;}}return ans;}vector<int> getvec(int l ,int r){vector<int> res;for(int i = l; i <= r; i++){res.push_back(i);}return res;}};
C++ 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2021-05-08
class Solution {public:vector<vector<int> > FindContinuousSequence(int sum) {int end=sum/2+1;//注意int left=1,right=1,current=1;vector<vector<int>>res;while(left<=end&&right<=end)//注意{if(current==sum){GetVector(res,left,right);right++;current+=right;}else if(current<sum){right++;current+=right;}else{left++;right=left;current=left;}}return res;}void GetVector(vector<vector<int>>&res,int left,int right){if(left>=right)//注意return;vector<int>v;for(int i=left;i<=right;i++){v.push_back(i);}res.push_back(v);}};
C++ 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2021-05-06
class Solution {public:vector<vector<int> > FindContinuousSequence(int sum) {vector<vector<int>> ans;int temp = 0, start = 1, end = 1;while (start <= sum / 2) {if (temp < sum) {temp += end;++end;} else if (temp > sum) {temp -= start;++start;} else {vector<int> ret;for (int i = start; i < end; ++i) {ret.push_back(i);}ans.push_back(ret);temp -= start;++start;}}return ans;}};