Title description
// 57.2 和为s的两个数字
// 力扣
// 输入一个正整数 target ,输出所有和为 target 的连续正整数序列
// (至少含有两个数)。
// 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
// 牛客
// 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上
// 就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续
// 的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正
// 数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快
// 的找出所有和为S的连续正数序列? Good Luck!
answer
// 牛客
// 思路简单,但是能做出来还是不容易的。
// 从前面初始化两个指针left和right,由于至少包含2个数,且必须是正整数
// 所以left初始化为1(left至少为1),right比left大,right至少为2,
// 累计的数组和至少为3,所以初始化累计和sum为3,
// 开始比较sum与target大小,如果sum比target小,需要窗口扩大,right右移
// 右移之后sum累加right,如果sum比target大,需要窗口缩小,left右移,
// sum累减left,之后left再右移(注意是先指针移动还是先操作sum加减)
// 直到sum等于target,将left到right之间所有元素存入新指定的ArrayList中
// 再存入res中。
// 运行时间:15ms,超过87.63%用Java提交的代码
// 占用内存:9984KB超过2.76%用Java提交的代码
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer>> FindContinuousSequence(int target) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if (target < 2)
return res;
int left = 1, right = 2;
int sum = 3;
while (left < right) {
if (sum < target) {
right++;
sum += right;
}
else if (sum > target) {
sum -= left;
left++;
}
else {
ArrayList<Integer> list = new ArrayList<>();
for (int i = left; i <= right; i++) {
list.add(i);
}
res.add(list);
sum -= left;
left++;
}
}
return res;
}
}
// 力扣
// 执行用时:2 ms, 在所有 Java 提交中击败了97.62%的用户
// 内存消耗:36.8 MB, 在所有 Java 提交中击败了17.75%的用户
import java.util.ArrayList;
class Solution {
public int[][] findContinuousSequence(int target) {
ArrayList<int[]> res = new ArrayList<>();
int left = 1, right = 2;
int sum = 3;
while (left < right) {
if (sum < target) {
right++;
sum += right;
}
else if (sum > target) {
sum -= left;
left++;
}
else {
int[] list = new int[right - left + 1];
int j = 0;
for (int i = left; i <= right; i++) {
list[j++] = i;
}
res.add(list);
sum -= left;
left++;
}
}
int[][] result = res.toArray(new int[res.size()][]);
return result;
}
}