class Solution {
public int[][] fileCombination(int target) {
List<int[]> result = new ArrayList<>();
int l = 1;
int r = 2;
int sum = 3;
while (l < r) {
if (target == sum) {
int[] s = new int[r - l + 1];
for (int i = l; i <= r; i++) {
s[i - l] = i;
}
result.add(s);
}
if (target <= sum) {
sum -= l;
l++;
} else {
r++;
sum += r;
}
}
return result.toArray(new int[0][]);
}
}
class Solution {
public int[][] fileCombination(int target) {
List<int[]> ans = new ArrayList<int[]>();
int head = 1;
int tail = 2;
int sum = 3;
while(head < tail){
if(sum == target){
// 将当前 结果保存
int[] current = new int[tail-head+1];
for(int i = head; i <= tail; i ++){
current[i-head] = i;
}
ans.add(current);
}
if(sum < target){
tail ++;
sum += tail;
}else if(sum >= target){
sum -= head;
head ++;
}
}
return ans.toArray(new int[0][]);
}
}
class Solution {
public int[][] fileCombination(int target) {
List<int[]> res = new ArrayList<>();
int l = 1, r = 2, sum = 3;
// l > target / 2,l+r就大于target了
while (l <= target / 2) {
if (sum < target) {
// l右移
r++;
sum += r;
} else if (sum > target) {
// r右移
sum -= l;
l++;
} else {
int[] temp = new int[r - l + 1];
for (int i = 0; i < r - l + 1; i++) {
temp[i] = l + i;
}
res.add(temp);
// l r 都右移
sum -= l;
l++;
r++;
sum += r;
}
}
return res.toArray(new int[res.size()][]);
}
}
class Solution {
public int[][] fileCombination(int target) {
int l = 1, r = 1;
List<int[]> list = new ArrayList();
int sum = 0;
while(r < target){
sum += r++;
while(sum > target){
sum -= l++;
}
if(sum target){
int[] res = new int[r – l];
for(int i = 0; i < res.length; i++){
res[i] = l + i;
}
list.add(res);
}
}
int[][] res = new int[list.size()][];
for(int i = 0; i < res.length; i++){
res[i] = list.get(i);
}
return res;
}
}
时间:O(n)
空间:O(n)
共以下 12 个回答
时间复杂度O(n)
空间复杂度O(1)
解题思路
– 定义一个左闭右开的滑动窗口,[l,r)。为什么是左闭右开,因为结果sum,如果是左边右滑(sum变小),只需要sum-当前l;如果是右边右滑(sum变大),只需要sum+当前r 即可【如果是右闭,就需要先r++再去sum+r,形式上不统一】。
– 左边只能右滑(让区间变小,让值变小),右边也只能右滑(让区间变大,值变大)【禁止左滑,会让情况变得复杂】
【题解1】
思路: 使用滑动窗口
时间空间
思路:数学公式、滑动窗口
时间复杂度:O(n)
空间复杂度:O(1)
利用整数l,r来记录滑动窗口左右断点,若窗口内数字和大于目标,则移动左端点,若小于,则移动右端点,若相同,则记录结果。
时间复杂度O(N),空间复杂度O(1)。
public int[][] fileCombination(int target) {> result = new ArrayList<>();
List<List
int left = 1, right = 2; // 滑动窗口的起点和终点
滑动窗口
On O根号 target
class Solution {
public int[][] fileCombination(int target) {
int l = 1, r = 1;
List<int[]> list = new ArrayList();
int sum = 0;
while(r < target){
sum += r++;
while(sum > target){
sum -= l++;
}
if(sum target){
int[] res = new int[r – l];
for(int i = 0; i < res.length; i++){
res[i] = l + i;
}
list.add(res);
}
}
int[][] res = new int[list.size()][];
for(int i = 0; i < res.length; i++){
res[i] = list.get(i);
}
return res;
}
}
时间:O(n)
空间:O(n)