题目
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
思路
- 集合转成数组的两种方法
- Object[] obj = arr.toArray();//第一种方法
// int [][]cures = new int [list.size()][];
cures = (int[][]) list.toArray(); - String[] obj1 = arr.toArray(new String[3]);//第二种方法
// return list.toArray(new int[list.size()][]);
- Object[] obj = arr.toArray();//第一种方法
- 双指针 。利用等差数列求出两个数字之间的和。和相等时就记录结果,否则依据是过大还是过小,进行移动指针
代码
public int[][] findContinuousSequence(int target) {
if(target<=0) return null;
ArrayList<int[]> list = new ArrayList<>();
int l = 1;
int r = 2;
//左指针不会超过一半部分,因为超过一半不会有两个数和等于目标值,题目也不允许输出单个值
while(l<=target/2){
int sum = (l + r) * (r - l + 1) >> 1;
if(sum==target){
int []res = new int[r-l+1];
//注意这个数组填入
for(int i = l;i<=r;i++){
res[i-l] = i;
}
list.add(res);
r++;
}else if(sum<target){
r = r+1;
}else {
l = l+1;
}
}
//注意结果的转化
return list.toArray(new int[list.size()][]);
}