leetcode刷题笔记4——和为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

来源:力扣(LeetCode)

方法思路:
拿target=15举例,可以分成(7+0)+(7+1)、(4+0)+(4+1)+(4+2)、(1+0)+(1+1)+(1+2)+(1+3)+(1+4),看到规律了吗?当用target一直减去1、2、3…………后如果target%(次数+1)值为0,则说明可以分。
细说,(15-1)%2值为0则可以说明可以分成2组;(15-1-2)%3值为0则说明可以分成3组;(15-1-2-3)%4!=0则说明15不能分成4组;(15-1-2-3-4)%5值为0则说明15可以分成5组…………

代码实现

class Solution {
    public int[][] findContinuousSequence(int target) {
        int i=1;
        int num=0; //计算总的能分几次
        List <int[]> result=new ArrayList<>();
        while(target>0){
            target-=i++;
            if(target>0 && target%i==0){
                int[] array=new int[i];
                for(int j=0;j<i;j++)
                    array[j]=target/i+j;
                result.add(array);
                num++;
            }
        }
        Collections.reverse(result);
        return result.toArray(new int[num][]);//列表转为二维数组
    }
}

你可能感兴趣的:(LeetCode算法题笔记)