美文网首页Leetcode
Leetcode.78.Subsets

Leetcode.78.Subsets

作者: Jimmy木 | 来源:发表于2019-10-11 10:54 被阅读0次

题目

给定一个整形数组, 输出所有可能的子数组.

Input: [1,2,3]
Output: [[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]

思路1

传统方法, 递归

从0个到n个子集依次递归.

void getCombinations(vector<vector<int>>& result, vector<int>& nums, vector<int>& temp, int index, int count) {
    if (count == 0) {
        result.push_back(temp);
        return;
    }

    for (int i = index; i < nums.size(); i++) {
        temp.push_back(nums[i]);
        getCombinations(result, nums, temp, i+1, count-1);
        temp.pop_back();
    }
}

vector<vector<int>> subsets(vector<int>& nums) {
    vector<vector<int>> result;
    vector<int> temp;

    for (int count = 0; count <= nums.size(); count++) {
        getCombinations(result, nums, temp, 0, count);
    }
    return result;
}   

思路2

借助2进制的思想, 010101刚好表示是否输出该元素, 从0到2的n次方遍历, 遇到1就输出该元素.

vector<vector<int>> subsets2(vector<int>& nums) {
  vector<vector<int>> result;
  int n = nums.size();
  for(int i = 0;i < (1 << n);i++) {
      vector<int> temp;
      for (int j = 0; j < n;j++) {
          if(i & (1<<j)) {
              temp.push_back(nums[j]);
          }
      }
      result.push_back(temp);
  }
  return result;
}

总结

这种问题最直接的方法就是递归, 一定要熟练掌握递归要领.

2进制方法往往可以比较巧妙处理问题.

相关文章

  • Leetcode.78.Subsets

    题目 给定一个整形数组, 输出所有可能的子数组. 思路1 传统方法, 递归 从0个到n个子集依次递归. 思路2 借...

网友评论

    本文标题:Leetcode.78.Subsets

    本文链接:https://www.haomeiwen.com/subject/fetqyctx.html