class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> res = new ArrayList<>();
int l = 1;
int r = 2;
while(l < r){
// 利用数学公式计算双指针区间的和
int sum = (l + r) * (r - l + 1) / 2;
if(sum == target){
// 满足条件
int[] curr = new int[r - l + 1];
for(int i = l; i <= r; i ++){
curr[i-l] = i;
}
res.add(curr);
// 满足条件也要移动指针
l ++;
}else if(sum < target){
r ++;
}else{
l ++;
}
}
return res.toArray(new int[res.size()][]);
}
}
class Solution {
public int[][] findContinuousSequence(int target) {
//正数序列 连续几个数的和为target
int left = 1;
int right = 2;
int sum = 3;
List<int[]> list = new ArrayList<>();
while(left <= target / 2){
if(sum < target){
right++;
sum += right;
}else if(sum > target){
sum -= left;
left++;
}else{
int[] temp = new int[right - left + 1];
for(int i = left; i <= right; i++){
temp[i - left] = i;
}
list.add(temp);
sum -= left;
left++;
}
}
return list.toArray(new int[list.size()][]);
}
}
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> ans = new LinkedList<>();
int[] q = new int[100010];
int hh = 0, tt = -1;
int sum = 0;
for (int i = 1; i < target; i++) {
q[++tt] = i;
sum += i;
while (sum > target) sum -= q[hh++];
if (hh > tt || sum < target) continue;
int[] tmp = new int[tt - hh + 1];
for (int j = q[hh], k = 0; j <= q[tt]; j++, k++) {
tmp[k] = j;
}
ans.add(tmp);
}
return ans.toArray(new int[0][]);
}
}
def findContinuousSequence(target):
i = j = 1
res = []
# 这里要先设出sum=1,即i=j=1的情况,这样后面在滑动窗口的时候就可以在这个sum的基础上对移动的i或j做处理而得出sum,而不需要重新在遍历ij之间的元素得到sum
sum = 1
# 因为至少含有两个数,当只有两个数的时候只有两个数越接近,小的那个数就越大,且不会超过target//2
while i <= target //2:
if sum == target:
res.append([_ for _ in range(i,j+1)])
j += 1
i += 1
sum += (j-i+1)
elif sum > target:
i += 1
sum -= (i-1)
else:
j += 1
sum += j
return res
//滑动窗口
//lo 左边界 hi 右边界
func findContinuousSequence(target int) [][]int {
lo, hi, sum := 1, 1, 0
ans := make([][]int,0)
//左边界一定不能超过target/2
for lo <= target >> 1 {
if sum < target {
//和小于目标值
sum += hi
hi++
} else if sum > target {
//和大于目标值
sum -= lo
lo++
} else {
//找到序列
temp := make([]int,0)
for i := lo; i < hi; i++ {
temp = append(temp,i)
}
ans = append(ans,temp)
//起点右移
sum -= lo
lo++
}
}
return ans
}
public int[][] findContinuousSequence(int target) {
//时间复杂度O(n)
//空间复杂度O(1)
int i = 1, j = 2, sum = 3;
List<int[]> res = new ArrayList<>();
while (i < j) {
if (sum == target) {
int[] arr = new int[j - i + 1];
for (int k = i; k <= j; k++) {
arr[k - i] = k;
}
res.add(arr);
}
if (sum >= target) {
//范围左边边界向右边移动
sum -= i;
i++;
} else {
//范围右边边界向右边移动
j++;
sum += j;
}
}
return res.toArray(new int[0][]);
}
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> res = new ArrayList<>();
int l = 1,r = 1;
int sum = 1;
while(l <= target/2){
if(sum < target){
r = r + 1;
sum += r;
}else if(sum > target){
sum = sum - l;
l++;
}else{
int[] arr = new int[r-l+1];
int index = 0;
for(int i = l;i<=r;i++){
arr[index++] = i;
}
sum -= l;
l++;
r++;
sum = sum+r;
res.add(arr);
}
}
return res.toArray(new int[res.size()][]);
}
}
var findContinuousSequence = function(target) {
let result = [];
if (target <= 2) return result;
let l = 1;
let r = 2;
let sum = 3;
while (l < r) {
if (sum === target) {
let temp = [];
for (let k = l; k <= r; k++) {
temp.push(k);
}
result.push(temp);
}
// 窗口和小于target时,窗口向右扩大
if (sum < target) {
r++;
sum+=r;
} else {
// 窗口向左缩小
sum-=l;
l++;
}
}
return result;
};
class Solution {
public int[][] findContinuousSequence(int target) {
//这个target
List<int[]> list = new ArrayList<>();
int i = 1,j = 1;
int sum = 1;
while(i <= target/2){
if (sum<target){
j++;
sum += j;
}else if(sum > target){
sum -= i;
i++;
//目标值相等的情况下
}else{
int [] temp = new int[j-i+1];
int index = 0;
for(int k = i;k <= j;k++){
temp [index++] = k;
}
sum -= i;
i++;
j++;
sum += j;
list.add(temp);
}
}
return list.toArray(new int[list.size()][]);
}
}
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
left,right,sum ,lst = 1,2,3,[]
while left < right:
if sum == target:
lst.append(list(range(left,right+1)))
if sum >= target:
sum -=left
left +=1
else:
right +=1
sum +=right
return lst
class Solution {
//使用滑动窗口的方法,从一开始不断向右递增,找到第一个大于S的位置,然后左边界缩小,直至到<= target/2
//时间复杂度O(n)
//空间复杂度O(1)
public int[][] findContinuousSequence(int target) {
List<int[]> list = new ArrayList<>();
int l = 1;
int r = 1;
int sum = 1;
while(l <= target/2){
if(sum < target){
r++;
sum += r;
}else if (sum > target) {
sum -= l;
l++;
}else {
int[] temp = new int[r - l + 1];
int t = l;
for (int i = 0; i < r - l + 1; i++) {
temp[i] = t;
t++;
}
list.add(temp);
sum -= l;
l++;
r++;
sum += r;
}
}
return list.toArray(new int[list.size()][]);
}
}
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> list = new ArrayList<>();
int i = 1,j = 1,sum = 1;
while(i <= target/2){
if(sum < target){
j++;
sum += j;
}else if(sum > target){
sum -= i;
i++;
}else{
int[] res = new int[j - i + 1];
int index = 0;
for(int k = i;k <= j;k++){
res[index++] = k;
}
sum -= i;
i++;
j++;
sum += j;
list.add(res);
}
}
return list.toArray(new int[list.size()][]);
}
}
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> res = new ArrayList();
int l = 1, r = 1;
int sum = 0;
for(int i = 1; i < target; i++) {
sum += i;
while(sum > target) {
sum -= l;
l++;
}
if(sum == target) {
int[] t = new int[r-l+1];
int idx = 0;
for (int j = l; j <= r; j++) {
t[idx++] = j;
}
res.add(t);
}
r++;
}
return res.toArray(new int[res.size()][]);
}
}
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> res = new ArrayList<>();
int i = 1, j = 1;
int sum = 1;
while (i <= target / 2) {
if (sum < target) {
j++;
sum += j;
} else if (sum > target) {
sum -= i;
i++;
} else {
int[] temp = new int[j - i + 1];
int index = 0;
for (int k = i; k <= j; k++) {
temp[index++] = k;
}
sum -= i;
i++;
j++;
sum += j;
res.add(temp);
}
}
return res.toArray(new int[res.size()][]);
}
}
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
# i左边界 j 有边界 s和 res结果
i, j, s, res = 1, 2, 3, []
while i < j:
if s == target:
res.append(list(range(i, j + 1)))
if s >= target:
s -= i
i += 1
if s < target:
j += 1
s += j
return res
共以下 25 个回答
得先减去左侧指针的值,再执行left++
双指针
时间:O(target)
空间:O(1)
时间O(n)
空间O(1)
思路:滑动窗口
感觉滑动窗口和二分法差不太多
滑动窗口,
时间复杂度O(target)空间复杂度O(1)
时间复杂度O(target)空间复杂度O(1)
时间复杂度为O(n),空间复杂度为O(1)
List的用法
//相当典型的滑动窗口问题> findContinuousSequence(int target) { > res; path;
class Solution {
public:
vector<vector
vector<vector
vector
int sum=1;
int l=1;
path.push_back(1);
for(int r=2;r<=target;++r){
sum+=r;
path.push_back(r);
while(l<r&&sum>target){
sum-=(l++);
path.erase(path.begin()+0);
}
if(path.size()>1&&sumtarget) res.push_back(path);
}
return res;
};
时间:O(target),空间:O(1)
时间复杂度 O(logn)