和为s的连续正数序列

1:题目描述

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

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

 

示例 1:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2:题目分析

  遍历前一半的数,在该数基础上之上不断增加序列长度直到满足!

3:代码示例

package JianZhiOffer57_2;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * @author :dazhu
 * @date :Created in 2020/4/13 11:41
 * @description:和为s的连续正数序列
 * @modified By:
 * @version: $
 */
public class Main {
    public static void main(String[]args){
        Solution solution = new Solution();
        solution.findContinuousSequence(15);
    }
}

//思路分析:通过从1开始不断得进行增加长度直到出现一个满足条件的为止,一旦超过目标值还没找到,则直接break
//换下一个值重复这个时间复杂度为O(n^2)
class Solution {
    public int[][] findContinuousSequence(int target) {
        //缓存结果的list
        ArrayList<int[]> arrayList = new ArrayList<>();
        //初始化中间变量
        int limit = target/2;
        int index = 0;
        int sum = 0;
        int temp=0;
        int size = 0;
        for(int i=1;i<=limit;i++){
            sum = 0;
            temp = i;
            //循环判断是不是满足
            while(true){
                //一旦超过,则不可能满足了,break
                if(sum >target){
                    break;
                }
                //满足,则构造数组入list
                if(sum == target){
                    size = temp-i;
                    int []arr = new int[size];
                    for(int k=0;k<size;k++){
                        arr[k] = k+i;
                    }
                    arrayList.add(arr);
                    break;
                }
                //不满足则增加长度,以达到满足
                sum = sum + temp;
                temp++;
            }
        }
//        //将ArrayList转成二维整形数组
//        int[][] result = new int[arrayList.size()][];
//        for(int i=0;i<arrayList.size();i++){
//            List l = arrayList.get(i);
//            int size = l.size();
//            int[] temp1 = new int[size];
//            for(int j=0;j<size;j++){
//                temp1[j] = (Integer)l.get(j);
//            }
//            result[i] = temp1;
//        }

        return arrayList.toArray(new int[arrayList.size()][]);
    }

}

 

posted @ 2020-04-13 17:44  大朱123  阅读(148)  评论(0编辑  收藏  举报