class Solution {
public int[][] fileCombination(int target) {
int i = 1, j = 2, s = 3;
List<int[]> res = new ArrayList<>();
while(i < j){
if(s == target){
int[] ans = new int[j-i+1];
for(int k = i; k <= j; k++){
ans[k - i] = k;
}
res.add(ans);
}
if (s >= target) {
s -= i;
i++;
} else {
j++;
s += j;
}
}
return res.toArray(new int[0][]);
}
}
class Solution:
def fileCombination(self, target: int) -> List[List[int]]:
i, j, s, res = 1, 2, 3, []
while i < j:
if s target:
res.append(list(range(i,j+1)))
if s >= target:
s -= i
i += 1
else:
j += 1
s += j
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> res = new ArrayList<>();
int i = 1, j = 1;
int sum = 1;
while(i <= target/2){
if(sum < target){
j++;
sum = sum + j;
} else if(sum > target){
sum = sum - i;
i++;
} else {
int[] temp = new int[j - i + 1];
int index = 0;
for(int k = i; k <= j; k++){
temp[index++] = k;
}
sum = sum - i;
i++;
j++;
sum = sum + j;
res.add(temp);
}
}
return res.toArray(new int[res.size()][]);
}
}
class Solution {
public int[][] fileCombination(int target) {
List<int[]> list = new ArrayList<>();
int i = 1, j = 2 , s = 3;
while (i < j) {
if (s == target) {
int[] ans = new int[j - i + 1];
for (int k = i; k <= j; k++) {
ans[k - i] = k;
}
list.add(ans);
}
if (s >= target) {
s = s - i;
i++;
} else {
j++;
s = s + j;
}
}
return list.toArray(new int[0][]);
}
}
class Solution {
public int[][] fileCombination(int target) {
List<int[]> ans = new ArrayList<>();
int begin = 1;
int end = 1;
int sum = 1;
while(begin <= end && end < target){
if(sum target){
int[] t = new int[end-begin+1];
for(int i = 0; i <= end – begin; i++)
t[i] = i + begin;
ans.add(t);
sum -= begin;
begin++;
}
else if(sum > target){
sum -= begin;
begin ++;
}
else{
end++;
sum += end;
}
}
return ans.toArray(new int[0][]);
}
}
//时间复杂度On
//空间复杂度O1
func fileCombination(target int) [][]int {
low, sum := 1, 0
var ans [][]int
end := target / 2 + 1
for cur:=low; cur <= end; cur++ {
sum += cur
if sum > target {
for low<=cur && sum > target {
sum -= low
low++
}
}
if sum == target {
var tmp []int
for i:=low; i<=cur; i++ {
tmp = append(tmp, i)
}
ans = append(ans, tmp)
sum -= low
low++
}
}
return ans
}
class Solution {
public int[][] findContinuousSequence(int target) {
List<int[]> res = new ArrayList<>();//保存结果
int i = 1, j = 1;//左右指针
int sum = 1;//初始化窗口的和
while(i <= target/2){//左边界不会超过 target/2,因为至少含有两个数,如果左边界超过了,右边界也一定超过了,和一定不符合了
if(sum < target){ //右边界向右一位
j++;
sum = sum + j;
} else if(sum > target){//左边界向右一位
sum = sum - i;
i++;
} else {//左找到目标值
int[] temp = new int[j - i + 1];
int index = 0;
for(int k = i; k <= j; k++){
temp[index++] = k; //保存起来
}
sum = sum - i;
i++;//左右边界都向右移一位
j++;//这里是一个小优化,因为 sum = sum - i; 之后一定<target
sum = sum + j;
res.add(temp);
}
}
return res.toArray(new int[res.size()][]);//转为二维数组
}
}
共以下 17 个回答
public int[][] fileCombination(int target) {
int i=1;
int j=1;
int sum=0;
List<int[]> res = new ArrayList<>();
while(i<=target/2){
if(sum<target){
sum+=j;
j++;
}else if(sum>target){
sum-=i;
i++;
}else{
int[] ans =new int[j-i];
for(int k=i;k<j;k++){
ans[k-i]=k;
}
res.add(ans);
sum-=i;
i++;
}
}
return res.toArray(new int[res.size()][]);
}
思路:滑动窗口
时间复杂度$O(n)$,空间复杂度$O(1)$
class Solution {> fileCombination(int target) { > res; ans;
public:
vector<vector
int i = 1, j = 2, s = 3;
vector<vector
while(i < j) {
if(s target) {
vector
for(int k = i; k <= j; k++)
ans.push_back(k);
res.push_back(ans);
}
if(s >= target) {
s -= i;
i++;
} else {
j++;
s += j;
}
}
return res;
}
};
时间复杂度O(n) 空间复杂度O(1)
时间复杂度O(n)
class Solution:
def fileCombination(self, target: int) -> List[List[int]]:
i, j, s, res = 1, 2, 3, []
while i < j:
if s target:
res.append(list(range(i,j+1)))
if s >= target:
s -= i
i += 1
else:
j += 1
s += j
o n o 1 空间
时间复杂度:O(n)
额外空间复杂的:O(1)
打卡
滑动窗口
class Solution {
public int[][] fileCombination(int target) {
List<int[]> ans = new ArrayList<>();
int begin = 1;
int end = 1;
int sum = 1;
while(begin <= end && end < target){
if(sum target){
int[] t = new int[end-begin+1];
for(int i = 0; i <= end – begin; i++)
t[i] = i + begin;
ans.add(t);
sum -= begin;
begin++;
}
else if(sum > target){
sum -= begin;
begin ++;
}
else{
end++;
sum += end;
}
}
return ans.toArray(new int[0][]);
}
}
//时间复杂度On
//空间复杂度O1
时间复杂度:O(n)
空间复杂度:O(1)
通过i和j作为滑动窗口,最开始没处理循环的问题
时间复杂度O(n)
空间复杂度O(1)
“`c++> fileCombination(int target) {> result; temp(j – i + 1);
class Solution {
public:
vector
if(target == 0)
{
return {};
}
//通过i和j作为滑动窗口
int sum = 1;
vector
for(int i = 1, j = 1; i <= target/2;) { if(sum < target) { j++; sum += j; } else if(sum > target)
{
sum -= i;
i++;
}
else
{
vector
for(int k = i, number = 0; k <= j; number++ ,k++) { temp[number] = k; } sum -= i; i++; j++; sum += j; result.push_back(temp); } } return result; } }; ```
java
class Solution{
public int[][] fileCombination(int target){
List<int[]> vec = new ArrayList<int[]>();
int sum = 0, limit = (target – 1) / 2;
for(int i = 1; i <= limit; ++i){
for(int j = i;; ++j){
sum += j;
if(sum > target){
sum = 0;
break;
}else if(sum target){
int[] res = new int[j – i + 1];
for(int k = i; k <= j; ++k){
res[k – i] = k;
}
vec.add(res);
sum = 0;
break;
}
}
}
return vec.toArray(new int[vec.size()][]);
}
}
提交
思路:滑动窗口
class Solution {> fileCombination(int target) { > res; ans;
public:
vector<vector
vector<vector
vector
for(int l = 1, r = 2; l < r;) {
if(target <= r) break;
int sum = (l + r) * (r – l + 1) / 2;
if(sum target) {
for(int i = l; i <= r; i ++) {
ans.push_back(i);
}
res.push_back(ans);
ans.clear();
l ++;
r ++;
}
if(sum > target) {
l ++;
}
if(sum < target) {
r ++;
}
}
return res;
}
};
时间复杂度O(n),空间复杂度O(1)
“`