0%

和为s的连续正数序列-LeetCode

和为s的连续正数序列

和为s的连续正数序列

1
2
3
4
5
6
7
8
9
10
11
面试题57:和为s的连续正数序列
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

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

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

Implementation:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class FindContinuousSequence {
public static void main(String[] args) {
int target = 28;
for (int[] arrs:findContinuousSequence(target)) {
for (int arr:arrs) {
System.out.print(arr);
}
System.out.println();
}
test();
}

public static int[][] findContinuousSequence(int target){
ArrayList<int[]> list = new ArrayList();
for (int i = 1; i < target/2+2; i++) {
int target2 = target;
boolean flag = false;
//连续序列的开始为i
int end = 0;//连续序列的结束
for (int j = i; j < target/2+2; j++) {
target2 -= j;
if (target2 < 0 ){//不是连续序列
break;
}
if (target2 == 0 ){//是连续序列
end = j;
flag = true;
}
}
if (flag){
int[] a = new int[end - i+1];
int b = 0;
for (int j = i; j < end+1; j++) {
a[b] = b+i;
b++;
}
list.add(a);//不知道二维数组长度,先放在list中
}
}
//从list取出数据转移到要求的二维数组中
int[][] aa = new int[list.size()][];
for (int i = 0; i < list.size(); i++) {
aa[i] = list.get(i);
//System.out.println(Arrays.toString((int[])list.get(i)));
}
return aa;
}

public static void test(){
int target = 15;
for (int i = 1; i < target/2 + 1; i++) {
//i为连续序列开头
int b = 0;//连续序列结尾
boolean flag = false;
for (int j = i + 1; j < target/2 + 2; j++) {
if ((i+j)*(j-i+1)/2 == target){
b = j;
flag = true;
}
}
if (flag){
System.out.println(i+"-"+b);
}
}
}
}