剑指 Offer 57 - II. 和为s的连续正数序列(简单)

思路:

连续正整数序列,可以想到:

1)用滑动窗口

2)下标和值一一对应

 

代码:

class Solution {
    public int[][] findContinuousSequence(int target) {
		//双指针滑动窗口
		int i=1,j=2,s=3;
		List<int[]> res=new ArrayList<>();
		
		while(i<j){
            if(s==target){
				int[] path=new int[j-i+1];
				for(int x=i;x<=j;x++){
					//注意下标是x-i
					path[x-i]=x;
				}
				res.add(path);
				s-=i;
				i++;
			}
            //注意这里是>=,还要算上=的情况,所以s==target要放在最上面考虑
			else if(s<target){
				j++;
				//因为是连续的正整数序列,所以值也是直接+-索引即可
				s+=j;
			}
            
			else{
				s-=i;
				//注意顺序,j是要先自增,i是要先s减掉i
				i++;
			}
			
		}
		//二维数组的第一个[]必须要赋值长度
		return res.toArray(new int[0][]);
    }
}

 

分解:

1)使用双指针的滑动窗口

注意s<target时:

要先j++再改变s值

 

s>target时:

要先改变s值再i++

 

2)下标和值一一对应,改变s值只需要加减下标值i或j即可

 

3)toArray()方法要在括号内写上改变的形式,例如:

res.toArray(new int[0][])

 

4)i、j、s的初始化可以是:

int i=1,j=2,s=3;

因为是连续的,所以i、j指针从头开始,s就是i+j=3

 

复杂度分析:

时间复杂度:O(N) 2个指针只走了一轮

空间复杂度:O(1)

以下不算额外空间(List<int[]>也算是int[][])

List<int[]> res=new ArrayList<>();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值