以为是n-sum题,输出所有的组合的可能,但是不是的,更简单一些,因为限制条件是必须连续的数
两种方法
第一种,利用数学知识归纳,数列长度为n,分成n为奇数和n为偶数两种情况
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
for (int n = (int) Math.sqrt(2 * sum); n >= 2; n--) {
if ((n & 1) == 1 && sum % n == 0 || (sum % n) * 2 == n) {
ArrayList<Integer> list = new ArrayList<>();
for (int j = 0, k = (sum / n) - (n - 1) / 2; j < n; j++, k++) {
list.add(k);
}
ans.add(list);
}
}
return ans;
}
}
第二种,设置两个指针,低位指针当sum大于k的时候右移,当确定一种方案后右移;高位指针当sum小于k的时候右移
//左神的思路,双指针问题
//当总和小于sum,大指针继续+
//否则小指针+
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int> > allRes;
int phigh = 2,plow = 1;
while(phigh > plow){
int cur = (phigh + plow) * (phigh - plow + 1) / 2;
if( cur < sum)
phigh++;
if( cur == sum){
vector<int> res;
for(int i = plow; i<=phigh; i++)
res.push_back(i);
allRes.push_back(res);
plow++;
}
if(cur > sum)
plow++;
}
return allRes;
}
};
https://www.nowcoder.com/questionTerminal/c451a3fd84b64cb19485dad758a55ebe
有时间再补代码