LeetCode 17.和为s的连续正数序列 暴力破解法和数学方法之间的差距

题目描述

难度:简单

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

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

 

示例 1:

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


示例 2:

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

限制:

1 <= target <= 10^5

 

解题思路

暴力破解法:

套滑动窗口模板,l是窗口左边界,r是窗口右边界,窗口中的值一定是连续值。
当窗口中数字和小于target时,r右移; 大于target时,l右移; 等于target时就获得了一个解

数学方法:

先找到符合的连续的2个数之和,然后符合的连续3个数,这样子递增的。例如9,先找符合的连续两个数是4+5=4+(4+1),连续的三个数是2+3+4=2+(2+1)+(2+2)。难点是,我们能如何找到连续两个数开头的4和连续三个数的2,我们就可以根据开头的数自增就可以了,即设第一个值为a,一共有n个数,那么 ((a+a+n-1)/2)*n=target, 推导得 a=(target-n*(n-1)/2)/n, n(n-1)/2 是1到n-1的和,所以要target-=i++,然后就是一个个试n了

代码如下

暴力破解法:

class Solution {
   public int[][] findContinuousSequence(int target) {
        List<int[]> list = new ArrayList<>();

        //🧠里要有一个区间的概念,这里的区间是(1, 2, 3, ..., target - 1)
        //套滑动窗口模板,l是窗口左边界,r是窗口右边界,窗口中的值一定是连续值。
        //当窗口中数字和小于target时,r右移; 大于target时,l右移; 等于target时就获得了一个解
        for (int l = 1, r = 1, sum = 0; r < target; r++) {
            sum += r;
            while (sum > target) {
                sum -= l++;
            }
            if (sum == target) {
                int[] temp = new int[r - l + 1];
                for (int i = 0; i < temp.length; i++) {
                    temp[i] = l + i;
                }
                list.add(temp);
            }
        }

        int[][] res = new int[list.size()][];
        for (int i = 0; i < res.length; i++) {
            res[i] = list.get(i);
        }
        return res;
    }
}

 

数学方法:

 

class Solution {
    public int[][] findContinuousSequence(int target) {
        
        List<int[]> result = new ArrayList<>();
        int i = 1;

        while(target>0)
        {
            target -= i++;
            if(target>0 && target%i == 0)
            {
                int[] array = new int[i];
                for(int k = target/i, j = 0; k < target/i+i; k++,j++)
                {
                    array[j] = k;
                }
                result.add(array);
            }
        }
        Collections.reverse(result);
        return result.toArray(new int[0][]);       
    }
}

 作者:力扣大神-------VaporMax


 链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/solution/java-shuang-100-by-vapormax/

 

 

posted @ 2020-03-06 23:08  Transkai  阅读(142)  评论(0编辑  收藏  举报