zoukankan      html  css  js  c++  java
  • Subsets 子集系列问题 leetcode

    子集系列问题

    Coding 问题中有时会出现这样的问题:给定一个集合,求出这个集合所有的子集(所谓子集,就是包含原集合中的一部分元素的集合)。

    或者求出满足一定要求的子集,比如子集中元素总和为定值,子集元素个数为定值等等。

    我把它们归类为子集系列问题。

    leetcode上原题链接

    思路分析:

    思路一

    可以用递推的思想,观察S=[], S =[1], S = [1, 2] 时解的变化。

    可以发现S=[1, 2] 的解就是 把S = [1]的所有解末尾添上2,然后再并上S = [1]里面的原有解。因此可以定义vector<vector<int> > 作为返回结果res, 开始时res里什么都没有,第一步放入一个空的vecotr<int>,然后这样迭代n次,每次更新res 内容,最后返回res。

     1 class Solution {
     2 public:
     3     vector<vector<int>> subsets(vector<int>& nums)
     4     {
     5         vector<vector<int>> res;
     6         vector<int> temp;
     7         res.push_back(temp);
     8         if(nums.empty())
     9             return res;
    10         sort(nums.begin(),nums.end());
    11         for(vector<int>::iterator i=nums.begin();i!=nums.end();i++)
    12         {
    13            int size=res.size();
    14            for(int j=0;j<size;j++)//这里注意因为res一直在增长,所以遍历res的时候不能用vector<int>::iterator,否则可能因为vector重新allocate内存而地址失效,因此直接使用数组下标。
    15            {
    16                 vector<int> tem;
    17                 for(auto begin=res[j].begin();begin!=res[j].end();begin++)//仅仅是为了完成在末尾添加新元素(复制+末尾插入)
    18                     tem.push_back(*begin);
    19                 tem.push_back(*i);
    20                 res.push_back(tem);
    21            }
    22 
    23         }
    24         return res;
    25     }
    26 };
    手里拿着一把锤子,看什么都像钉子,编程界的锤子应该就是算法了吧!
  • 相关阅读:
    Bresenham画线算法
    DDA算法
    GL_LINES & GL_LINE_STRIP & GL_LINE_LOOP
    贝塞尔曲线
    弱引用
    Lambert模型
    ShadowVolume
    Phong Shading
    求反射向量
    Vertex Modifier of Surface Shader
  • 原文地址:https://www.cnblogs.com/chess/p/5097563.html
Copyright © 2011-2022 走看看