美文网首页
面试题57_II_和为s的连续正数序列

面试题57_II_和为s的连续正数序列

作者: shenghaishxt | 来源:发表于2020-02-19 13:17 被阅读0次

    题目描述

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

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

    题解

    借用上一题的思想,还是使用双指针,只是这里的指针代表的不是数组下标,而是数字。开始时把left初始化为1,right初始化为2。题目连续正数列的性质,可以使用求和公式求序列和:s = (首项+末项) * 项数 / 2

    有一个地方要注意,正数序列的第一个数不可能超过s的一半,将这个条件加入循环条件避免多余的运算。

    • 如果序列和小于sum,则扩大序列的范围,即right++;
    • 如果序列和大于sum,则缩小序列的范围,即left+;
    • 如果序列和等于sum,则找到一个结果。然后扩大序列的范围,即right++。

    下面是参考代码:

    class Solution {
        public int[][] findContinuousSequence(int target) {
            ArrayList<int[]> resArr = new ArrayList<>();
            int left = 1, right = 2;
            while (left < right && left <= target/2) {
                int curSum = (left + right) * (right - left + 1) / 2;
                if (curSum < target) {
                    right++;
                } else if (curSum > target) {
                    left++;
                } else {
                    int[] temp = new int[right - left + 1];
                    int begin = left;
                    for (int i = 0; i < temp.length; i++) {
                        temp[i] = begin++;
                    }
                    resArr.add(temp);
                    left++;
                }
            }
            int[][] res = new int[resArr.size()][];
            for (int i = 0; i < res.length; i++) {
                res[i] = resArr.get(i);
            }
            return res;
        }
    }
    

    相关文章

      网友评论

          本文标题:面试题57_II_和为s的连续正数序列

          本文链接:https://www.haomeiwen.com/subject/kltafhtx.html