Open songyy5517 opened 1 year ago
思路:双指针 & 滑动窗口
复杂度分析
class Solution {
public int[][] findContinuousSequence(int target) {
// 思路:双指针滑动窗口
// 1. 异常处理
if (target <= 2)
return new int[0][0];
// 2. 定义相关变量
ArrayList<int[]> record = new ArrayList(); // !数组列表的定义方式
int start_1 = 1, start_2 = 2, sum = 3; // !sum可优化
while(start_1 < start_2){
if (sum == target){
int[] res = new int[start_2 - start_1 + 1];
for (int i = 0; i < res.length; i++)
res[i] = start_1 + i;
record.add(res);
}
if (sum >= target){ // 合并等于的情况
sum -= start_1;
start_1 ++;
}
else {
start_2 ++;
sum += start_2;
}
}
// 3. 返回结果
return record.toArray(new int[record.size()][]); // !从列表转换成数组
}
}
Key points
2024/3/15
2024/3/16
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
示例 2:
分析 这道题需要求连续正数序列的和。考虑到连续这个性质,我们可以使用双指针实现滑动窗口模拟序列的变化过程。初始状态下将窗口设为[1, 2],当窗口和小于sum时,扩充窗口的右边界;当窗口和大于或等于sum时,收缩窗口的左边界。当窗口大小为1时,停止操作。