トピックの説明
正の整数ターゲットを入力し、合計がターゲットとなる連続するすべての正の整数シーケンス (少なくとも 2 つの数値を含む) を出力します。
シーケンス内の数字は小さいものから大きいものへと配置され、最初の数字に従って小さいものから大きなものまで異なるシーケンスが配置されます。
一連の考え
スライディング ウィンドウ
境界条件に注意してください。無視されている点が 2 つあり、100% にはなりません。
- while(i <= sum / 2) ; write less = ; したがって、合計が 3 の場合、すべてが飛び出して出力されます。
- int i = leftp; i< rightp;i++; write more =; 右ポインタの部分が最初に合計され、次に加算されます。したがって、現時点では、右ポインタは arr の最後の要素を指しません。
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
int leftp = 1;
int rightp = 1;
int sum_temp = 0;
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
// 注意这里边界条件
while(leftp <= sum / 2){
if(sum_temp < sum){
sum_temp += rightp;
rightp++;
}
else if(sum_temp > sum){
sum_temp -= leftp;
leftp++;
}
else{
ArrayList<Integer> arr = new ArrayList<>();
//注意这里边界条件
for(int i = leftp; i < rightp; i++){
arr.add(i);
}
res.add(arr);
// 左指针右移一位
sum_temp -= leftp;
leftp += 1;
}
}
return res;
}
}