剑指 Offer 57

这里贴的牛客,LeetCode 和牛客会有一丢丢不一样,不过解题思路是一样的。

//滑动窗口法,窗口区间一般规定为 左闭右开,这里也是
import java.util.ArrayList;
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
       //定义一个结果集
        ArrayList<ArrayList<Integer> > res = new ArrayList<>();
        //滑动窗口左右边界
        int left = 1;
        int right = 1;
        //滑动窗口中 数字的和
        int curSum = 0;
        
        while(left <= sum / 2){
            //当前滑动窗口的和 小于 sum,需要增大curSum
            if(curSum < sum){
               curSum = curSum + right;
               right++;
            } else if(curSum > sum){ //需要减小curSum
                curSum = curSum - left;
                left++;
            } else { //相等,保存这一序列
                ArrayList<Integer> list = new ArrayList<>();
                for(int index = left; index < right;index++){
                    list.add(index);
                }
                res.add(list);
                //左边界向右移动,找下一个符合条件的序列
                curSum = curSum - left;
                left++;
            }
        }
        return res;
    }
}
原文地址:https://www.cnblogs.com/peanut-zh/p/14151260.html