Problem: LCR 180. 文件组合
文章目录
- 题目描述
- 思路及解法
- 复杂度
- Code
题目描述
思路及解法
本题目可以利用滑动窗口的技巧(滑动窗口就是双指针的运用)解决,具体实现如下
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<int>>*/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;}
};