力扣LCR 180. 文件组合(双指针)

Problem: LCR 180. 文件组合

文章目录

  • 题目描述
  • 思路及解法
  • 复杂度
  • Code

题目描述

力扣LCR 180. 文件组合(双指针)_第1张图片在这里插入图片描述

思路及解法

本题目可以利用滑动窗口的技巧(滑动窗口就是双指针的运用)解决,具体实现如下

1.逻辑上生成窗口:让两个指针i,j分别初始化为1,2,并定义一个用于维护“窗口”的目标整形值sum,初始化为3
2.维护窗口:

若sum等于target则将j-i+1“窗口”内的值添加到结果集合中;然后sum -= i;i++;j++;sum += j;(维护新的“窗口”)
若sum大于target,则sum -= i;i++;
若sum小于target,则j++; sum += j;

复杂度

时间复杂度:

O ( n ) O(n) O(n);其中 n n n为小于或等于 t a r g e t target target的数

空间复杂度:

O ( n 2 ) O(n^2) O(n2)

Code

class Solution {
public:
    /**
     * Two pointer
     * @param target Target number
     * @return vector>
     */
    vector<vector<int>> fileCombination(int target) {
        vector<vector<int>> result;
        int i = 1;
        int j = 2;
        int sum = 3;
        while (i < j) {
            if (sum == target) {
                vector<int> temp(j - i + 1);
                for (int k = i; k <= j; ++k) {
                    temp[k - i] = k;
                }
                result.push_back(temp);
                sum -= i;
                i++;
                j++;
                sum += j;
            } else if (sum < target) {
                j++;
                sum += j;
            } else {
                sum -= i;
                i++;
            }
        }
        vector<vector<int>> resultArr(result.size());
        for (int k = 0; k < result.size(); ++k) {
            resultArr[k].resize(result[k].size());
            for (int l = 0; l < result[k].size(); ++l) {
                resultArr[k][l] = result[k][l];
            }
        }
        return resultArr;
    }
};

你可能感兴趣的:(力扣题目,leetcode,算法,职场和发展)