【LintCode】 -- Subsets II

【LintCode】 – Subsets II

和上一道题一脉相承,就是逻辑有点绕。

说下思路,也是dfs书,只不过要加一些判断。

比如说[1,2,2]这个输入,当处理到第二个2的时候,要判断前面是否添加了第1个2,如果添加了才能把这个2添加进去。如下面这个图。

这里写图片描述

只有前面添加了,才可能添加重复的2,要不然会变成重复元素。

推广一下,当添加第n个重复元素的时候,要先判断这个vector末尾开始是不是有n-1个这个元素,如果有的话就可以添加,如果没有则不添加。

class Solution {
private:
  vector<vector<int>> so;
public:
    /**
     * @param nums: A set of numbers
     * @return: A list of lists
     */
   vector<vector<int>> subsetsWithDup(vector<int> &nums) {
       // write your code here
       sort(nums.begin(), nums.end());
       vector<int> temp;
       dfs(nums, 0, temp);
       return so;
   }

   void dfs(vector<int> &nums, int dp, vector<int> &temp){
     if(dp == nums.size()){
       so.push_back(temp);
       return;
     }
     //先判断是否是连续添加的元素
     int samenum = 0;
     for(int i=dp-1; i>=0; i--){
       if(nums[i] == nums[dp])
        samenum++;
       else
        break;
     }
     //如果是连续的
     if(samenum){
       //找出在结尾位置前面有连续samenum个nums[dp]的temp
       int len = temp.size();
       int k = 0;
       for(int i=len-1; i>=0; i--){
         if(temp[i] == nums[dp])
          k++;
         else
          break;
       }

       if(k == samenum){
         //加
         temp.push_back(nums[dp]);
         dfs(nums, dp+1, temp);
         temp.pop_back();
       }

        dfs(nums, dp+1, temp);
     }
     else{
       //加
       temp.push_back(nums[dp]);
       dfs(nums, dp+1, temp);
       temp.pop_back();

       //不加
       dfs(nums, dp+1, temp);
     }

   }
};

猜你喜欢

转载自blog.csdn.net/qq_24889575/article/details/81949607