1 题目
输入一个正整数 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2 Java
2.1 !方法一(快慢指针,滑动窗口,数组链表)
总和sum小于目标target,右指针右移
总和sum大于目标target,左指针右移(重点!!!)
总和sum等于目标target,记录结果,左指针右移
注意答案记录在 LinkedList<int[]> 类型的list中
且最后将list转化为数组的操作,没太搞懂
class Solution {
public int[][] findContinuousSequence(int target) {
LinkedList<int[]> list = new LinkedList<>();
int l = 1, r = 1, sum = 0;
while(l <= target / 2){
if(sum < target) sum += (r++);
else if(sum > target) sum -= (l++);
else{
int[] a = new int[r - l];
for(int i = l; i < r; i++) a[i - l] = i;
list.add(a);
sum -= (l++);
}
}
return list.toArray(new int[list.size()][]);
}
}
2.2 方法二(快慢指针,滑动窗口,嵌套集合)
注意:
集合的深拷贝
二维数组分维度初始化
嵌套集合转二维数组
class Solution {
public int[][] findContinuousSequence(int target) {
List<List<Integer>> listList = new ArrayList<>();
List<Integer> list = new ArrayList<>();
int l = 1, r = 1, sum = 0;
while(l <= target / 2){ // !!!注意是<=,不是<,比如target=9,则target/2=4,所以必须有=
if(sum < target) sum += (r++);
else if(sum > target) sum -= (l++);
else{
for(int i = l; i < r; i++) list.add(i);
listList.add(new ArrayList<Integer>(list)); // 深拷贝
list.clear(); // 记得清除list
sum -= (l++); // !!!易忘,左端向右挪,找下一个符合要求的集合
}
}
int m = listList.size();
int[][] ans = new int[m][];
for(int i = 0; i < m; i++){
int n = listList.get(i).size();
// ans = new int[m][n]; !!!易错
ans[i] = new int[n];
for(int j = 0; j < n; j++) ans[i][j] = listList.get(i).get(j);
}
return ans;
}
}