zoukankan      html  css  js  c++  java
  • Permutations,Permutations II,Combinations

    这是使用DFS来解数组类题的典型题目,像求子集,和为sum的k个数也是一个类型

    解题步骤:

    1:有哪些起点,例如,数组中的每个元素都有可能作为起点,那么用个for循环就可以了。

    2:是否允许重复组合

    3:处理某个数,判断结果

    4:dfs递归

    5:还原现场

    一:Permutations

    Given a collection of numbers, return all possible permutations.

    For example,
    [1,2,3] have the following permutations:
    [1,2,3][1,3,2][2,1,3][2,3,1][3,1,2], and [3,2,1].

    代码:

    class Solution {
        void dfs(vector<int>& nums,int start,vector<vector<int>>& res,vector<int>& oneRes){
            
            int n = nums.size();
            
            if(start == n){
                res.push_back(oneRes);
            }
            
            for(int i= start;i<nums.size();++i){
                
                if(i>start && nums[i]==nums[i-1]){
                    continue;
                }
                
                oneRes.push_back(nums[i]);
                
                swap(nums[i],nums[start]);
                
                dfs(nums,start+1,res,oneRes);
                
                swap(nums[i],nums[start]);
                
                oneRes.pop_back();
            }
        }
    public:
        vector<vector<int>> permute(vector<int>& nums) {
            vector<vector<int>> res;
            vector<int> oneRes;
            
            dfs(nums,0,res,oneRes);
            
            return res;
        }
    };

    二:Permutations II

    Given a collection of numbers that might contain duplicates, return all possible unique permutations.

    For example,
    [1,1,2] have the following unique permutations:
    [1,1,2][1,2,1], and [2,1,1].

    方法1.

    class Solution {
    public:
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            
            vector<vector<int>> res;
            
            vector<int> tmp(nums);
            
            sort(tmp.begin(),tmp.end());
            
            res.push_back(tmp);
            
            while(next_permutation(tmp.begin(),tmp.end())){
                res.push_back(tmp);
            }
            
            return res;
        }
    };

    方法2.

    class Solution {
        
        void dfs(vector<int>& nums,int start,vector<vector<int>>& res,vector<int>& oneRes){
            
            int n = nums.size();
            
            if(start == n){
                res.push_back(oneRes);
            }
            
            for(int i= start;i<nums.size();++i){
                
                if(i>start && nums[i]==nums[i-1]){
                    continue;
                }
                
                int selectNum = nums[i];
                
                oneRes.push_back(selectNum);
                
                copy_backward(nums.begin()+start,nums.begin()+i,nums.begin()+i+1);
                nums[start] = selectNum;
                
                dfs(nums,start+1,res,oneRes);
                
                copy(nums.begin()+start+1,nums.begin()+i+1,nums.begin()+start);
                nums[i] = selectNum;
                
                oneRes.pop_back();
            }
        }
    public:
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            
            vector<vector<int>> res;
            vector<int> oneRes;
            
            sort(nums.begin(),nums.end());
            
            dfs(nums,0,res,oneRes);
            
            return res;
        }
    };

    方法3.

    class Solution {
    public:
        void dfs(vector<int> nums,int numsSize,int startPos,vector<vector<int>>& res,vector<int>& oneOfRes)
        {
            sort(nums.begin()+startPos,nums.end());
            for(int i=startPos;i<numsSize;i++){
                if(i>startPos && nums[i]==nums[i-1]){
                    continue;
                }
                oneOfRes.push_back(nums[i]);
                swap(nums[i],nums[startPos]);
                if(oneOfRes.size()==numsSize){
                    res.push_back(oneOfRes);
                }else{
                    dfs(nums,numsSize,startPos+1,res,oneOfRes);
                }
                swap(nums[i],nums[startPos]);
                oneOfRes.pop_back();
                
            }
        }
        vector<vector<int>> permuteUnique(vector<int>& nums) {
       //     sort(nums.begin(),nums.end());
            vector<vector<int>> res;
            vector<int> oneOfRes;
            int numsSize = nums.size();
            dfs(nums,numsSize,0,res,oneOfRes);
            return res;
        }
    };

    77. Combinations

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.

    For example,
    If n = 4 and k = 2, a solution is:

    [
      [2,4],
      [3,4],
      [2,3],
      [1,2],
      [1,3],
      [1,4],
    ]
    
    class Solution {
        void dfs(int n,int start,int k,int curk,vector<vector<int>>& res,vector<int>& oneRes){
            
            if(curk == 0){
                res.push_back(oneRes);
                return;
            }
            
            for(int i=start;i<=n;++i){
                
                oneRes.push_back(i);
                
                dfs(n,i+1,k,curk-1,res,oneRes);
                
                oneRes.pop_back();
    
            }
        }
    public:
        vector<vector<int>> combine(int n, int k) {
            
            vector<vector<int>> res;
            vector<int> oneRes;
            
            dfs(n,1,k,k,res,oneRes);
            
            return res;
        }
    };
  • 相关阅读:
    实参和形参
    location对象
    区别 apply,call
    窗体之间的交互(window.opener)
    我的升级脚本总结
    Create elements
    history 对象
    函数参数的属性:callee
    发布app store流程
    【转】如何生成静态页面的五种方案
  • 原文地址:https://www.cnblogs.com/zengzy/p/4961781.html
Copyright © 2011-2022 走看看