zoukankan      html  css  js  c++  java
  • leetcode46. Permutations 、47. Permutations II、 剑指offer字符串的排列

    字符串排列和PermutationsII差不多

    Permutations第一种解法:

    这种方法从0开始遍历,通过visited来存储是否被访问到,level代表每次已经存储了多少个数字

    时间复杂度O(n!)

    class Solution {
    public:
        vector<vector<int>> permute(vector<int>& nums) {
    
            vector<vector<int> > result;
            if(nums.empty())
                return result;
            vector<int> res;
            vector<bool> visited(nums.size(),0);
            int level = 0;
            permute(nums,result,res,visited,level);
            return result;
        }
        void permute(vector<int>& nums,vector<vector<int> >& result,vector<int>& res,vector<bool>& visited,int level){
            if(level == nums.size()){
                result.push_back(res);
           return;
    }
    for(int i = 0;i < nums.size();i++){ if(visited[i] == 1) continue; res.push_back(nums[i]); visited[i] = 1; permute(nums,result,res,visited,level+1); res.pop_back(); visited[i] = 0; } } };

    第二种解法:

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

    Permutations II

    class Solution {
    public:
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            vector<vector<int> > result;
            if(nums.empty())
                return result;
            vector<int> res;
            vector<bool> visited(nums.size(),0);
            int level = 0;
            sort(nums.begin(),nums.end());
            permute(nums,result,res,visited,level);
            return result;
        }
        void permute(vector<int>& nums,vector<vector<int> >& result,vector<int>& res,vector<bool>& visited,int level){
            if(level == nums.size()){
                result.push_back(res);
           return;
         }
    for(int i = 0;i < nums.size();i++){ if(visited[i] == 1) continue; if(i > 0 && nums[i] == nums[i-1] && visited[i-1] == 1) continue; visited[i] = 1; res.push_back(nums[i]); permute(nums,result,res,visited,level+1); res.pop_back(); visited[i] = 0; } } };

     把第二个剪枝写在for循环一开始这种方式,实际上每次只存储重复数字中的第二个,相当于按照逆序的方式存储相同的数字

  • 相关阅读:
    JS,JQ及时监听input值的变化,MUI的input搜索框里的清除按钮的点击监听事件
    MUI 底部弹出的选择框
    MUI 拍照或选取照片上传作为头像
    多行文本文本输入框 textarea 可点击任意地方编辑的问题
    mui dtpicker 时间的设置 以及MUI的弹窗
    MUI 样式按钮的禁用
    利用渐变实现书本的效果
    调用sqlserver中的存储过程
    XmlHelper
    面试题 数据库sql
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/10494767.html
Copyright © 2011-2022 走看看