• LeetCode Subsets


     1 class Solution {
     2 public:
     3     vector<vector<int> > subsets(vector<int> &S) {
     4         sort(S.begin(), S.end());
     5         vector<vector<int> > res;
     6         vector<int> path;
     7         dfs(S, path, 0, res);
     8         return res;
     9     }
    10     
    11     void dfs(vector<int>& s, vector<int>& cur, int pos, vector<vector<int> >& res) {
    12         if (pos == s.size()) {
    13             res.push_back(cur);
    14             return;
    15         }
    16         // case 1. put the current number into the set
    17         cur.push_back(s[pos]);
    18         dfs(s, cur, pos + 1, res);
    19         cur.pop_back();
    20         
    21         // case 2. skip the current number
    22         dfs(s, cur, pos + 1, res);
    23     }
    24 };

    起来水一发

    第二轮:

    Given a set of distinct integers, S, return all possible subsets.

    Note:

    • Elements in a subset must be in non-descending order.
    • The solution set must not contain duplicate subsets.

    For example,
    If S = [1,2,3], a solution is:

    [
      [3],
      [1],
      [2],
      [1,2,3],
      [1,3],
      [2,3],
      [1,2],
      []
    ]

    写一发Java版本:

    public class Solution {
        private List<List<Integer>> res = new LinkedList<List<Integer>>();
        public List<List<Integer>> subsets(int[] S) {
            res.clear();
            
            Arrays.sort(S);
            List<Integer> current = new LinkedList<Integer>();
            dfs(S, 0, current);
            return res;
        }
        
        private void dfs(int[] S, int pos, List<Integer> current) {
            if (pos == S.length) {
                res.add(new ArrayList<Integer>(current));
                return;
            }
            
            current.add(S[pos]);
            dfs(S, pos + 1, current);
            current.remove(current.size() - 1);
        
            dfs(S, pos + 1, current);
        }
    }

     找到另外一种递归解法,不过时间反而长了:

    public class Solution {
        private List<List<Integer>> res = new LinkedList<List<Integer>>();
        
        public List<List<Integer>> subsets(int[] nums) {
            res.clear();
            
            Arrays.sort(nums);
    
            dfs(nums, 0, new ArrayList<Integer>());
            
            return res;
        }
        
        private void dfs(int[] nums, int pos, List<Integer> current) {
            int len = nums.length;
            if (pos > len) {
                return;
            }
            
            res.add(new ArrayList<Integer>(current));
            
            for (int i = pos; i<len; i++) {
                current.add(nums[i]);
                dfs(nums, i + 1, current);
                current.remove(current.size() - 1);
            }
            
        }
    }

    非递归解法:

    class Solution {
    public:
        vector<vector<int>> subsets(vector<int>& nums) {
            
            sort(nums.begin(), nums.end());
            
            int len = nums.size();
            int total = 1<<len;
            vector<vector<int>> res(total);
            
            int last_size = 1;
            for (int i=0; i<len; i++) {
                for (int j=0; j<last_size; j++) {
                    res[last_size + j] = res[j];
                    res[last_size + j].push_back(nums[i]);
                }
                last_size = last_size * 2;
            }
            return res;
        }
    };
  • 相关阅读:
    [MySQL] 数据库基本概念
    [LeetCode] Number of 1 Bits
    [LeetCode] Maximum Subarray
    [LeetCode] Search Insert Position
    [LeetCode] Remove Duplicates from Sorted List
    [LeetCode] Path Sum III
    [LeetCode] Not Boring Movies
    [LeetCode] Swap Salary
    [LeetCode] Big Countries
    中国银联全渠道系统商户接入 测试指引-银联网关支付产品
  • 原文地址:https://www.cnblogs.com/lailailai/p/3660000.html
Copyright © 2020-2023  润新知