• 90. Subsets II (Back-Track, DP)


    Given a collection of integers that might contain duplicates, nums, 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 nums = [1,2,2], a solution is:

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

    思路: 对于重复了n次的字符,可以选择放入0,1,2...n个

    class Solution {
    public:
        vector<vector<int> > subsetsWithDup(vector<int> &S) {
            vector<vector<int>> result;
            vector<int> pre;
            if(S.size()==0)
                return result;
            sort(S.begin(),S.end());
            result.push_back(pre);
            dfs(S,result,pre,0);
            return result;
        }
        void dfs(vector<int> &S , vector<vector<int>> &result ,vector<int> pre , int depth)
        {
            if(depth == S.size())  return; //teminate condition
            
            int dupCounter = 0;
            int dupNum = 0;
            while(depth+1 < S.size() && S[depth] == S[depth+1]) //get duplicate times
            {
                depth++;
                dupNum++;
            }
            while(dupCounter++ <= dupNum) //push duplicate elements
            {
                pre.push_back(S[depth]);
                result.push_back(pre);
                dfs(S,result,pre,depth+1);
            }
            dupCounter = 0;
            while(dupCounter++ <= dupNum) //backtracking
            {
                pre.pop_back();
            }
            dfs(S, result,pre, depth+1); //push none, dfs directly
        }
    };

    思路II:DP,插入排序法增加元素。重复的元素要在一个for循环内插入,否则会导致subset有重复。

    class Solution {
    public:
        vector<vector<int>> subsetsWithDup(vector<int>& nums) {
            vector<vector<int>> ret;
            vector<int> retItem;
            ret.push_back(retItem);
            int size; //number of memebers in ret
            int count = 1; //count the duplicate number
            
            sort(nums.begin(),nums.end());
            
            for(int i = 0; i < nums.size(); i++){ //iterate the number to insert
                if(i < nums.size()-1 && nums[i+1]==nums[i]){
                    count++;
                    continue;
                }
                
                size = ret.size();
                for(int j = 0; j < size; j++){ //iterate current item in ret
                    vector<int> newItem = ret[j];
                    for(int k = 0; k < count; k++){ //duplicate 1,2,...,count times
                        newItem.push_back(nums[i]);
                        ret.push_back(newItem);
                    }
                }
                count = 1;
            }
            return ret;
        }
    };
  • 相关阅读:
    Docker 镜像
    Docker 安装命令
    Docker 基本概念
    Redis 高可用之"持久化"
    Git 安装和使用
    oracle角色
    oracle权限
    审计
    手动创建数据库
    oracle口令文件认证
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4855300.html
Copyright © 2020-2023  润新知