0%

78. Subsets

2018年4月13日 下午3:54
Subsets - LeetCode

回忆一下

写算法的思路总结(数据结构之后)

分析:

  1. 这个问题里理解item是最关键的问题
  2. 我们在上面几节的学习中没有涉及到递归,很多题总结下来本质就是一个数组的遍历,当然在不同的情况下,遍历的目的不同,可能是为了统计,可能是为了迭代出一个结果。
  3. 在这道递归的题中,我理解下来其实也是一个遍历数组的问题,eg遍历[1,2,3]。不使用递归时,我们有一个指针,通过这个指针去一个个的遍历,在递归中,我们每次调用递归函数,在调用的时候参数i++,其实就是指针的作用
  4. 在非递归中,我们统计、迭代、记录过程,在递归中我们也会统计、迭代、记录过程。
  5. 在这道题中,item其实就是一个“统计记录”。记录着我们当前操作到了哪里
  6. 他们最大的不同是:一次递归函数中调用了两次generate()函数,这就说明对同一个位置进行两次的操作。在非递归中我们一般对同一个位置只处理一次,因为一个循环是一个单线程,你无法同时让他们对一个位置的数据同处理。递归就提供了这种假的同时处理的可能。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    class Solution {
    public:
    std::vector<std::vector<int>> subsets(std::vector<int>& nums) {
    std::vector<std::vector<int>> result;
    std::vector<int> item;
    result.push_back(item);
    generate(result, 0, nums, item);

    return result;
    }
    private:
    //表面的一层
    void generate(std::vector<std::vector<int>> &result, int i, std::vector<int> nums,std::vector<int> item ){
    if(i >= nums.size()){
    return ;
    }
    //nums[i]放进入
    item.push_back(nums[i]);
    result.push_back(item);
    generate(result, i+1, nums, item );
    //nums[i]不放进入
    item.pop_back();
    generate(result, i+1, nums, item );//当到达右下角时,我们不放3,执行这里。结果直接返回了,那么[]空就没有放进入,需要我们自己手动的放

    }
    };