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

题目描述

输入一个正整数 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;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容