和为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()][]); } }