跳至主要內容

57(2)-和为s的连续正数序列

daipeng小于 1 分钟

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

输入:target = 9
输出:[[2,3,4],[4,5]]

输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]

这里注意,子串是指连续的,子序列是不一定连续的,但连续的正整数序列实际就是子串。

双指针

还是使用双指针算法,两个指针表示这个子串的头尾,当子串和为target时,记录。移动指针时对sum进行加减。

public int[][] findContinuousSequence(int target) {
        List<List<Integer>> data = new ArrayList<>();
        int i = 1, j = 2;
        int sum = i + j;
        while (i < j && j < target) {
            if(sum == target){//如果找到了,记录下,然后j前进
                data.add(IntStream.range(i, j + 1).boxed().collect(Collectors.toList()));
                j++;
                sum += j;
            } else if (sum < target) { //
                j++;
                sum += j;
            }else{
                sum -= i;
                i++;
            }
        }
        int[][] result = new int[data.size()][];
        for (int k = 0; k < data.size(); k++) {
            result[k] = data.get(k).stream().mapToInt(Integer::intValue).toArray();
        }
        return result;
    }