LeetCode 491递增子序列 46全排列 47全排列-ii | 代码随想录25期训练营day29

LeetCode 491 递增子序列 2023.11.22

class Solution {
    
    
public:
    //成员变量存储当前答案用vector,存储最终答案用set为了去重
    vector<int> cur;
    set<vector<int>> result;
    //递归回溯遍历
    void backtracking(vector<int> nums, int start)
    {
    
    
        //当前解数大于2时存入最后答案中
        if(cur.size() > 1)
            result.insert(cur);
        //遍历回溯
        for (int i = start; i < nums.size(); i++)
        {
    
    
            //当满足cur为空或者不为空时下一个遍历的数不小于cur中数时,递归然后回溯
            if(cur.empty() || (!cur.empty() && nums[i] >= cur[cur.size()-1]))
            {
    
    
                cur.push_back(nums[i]);
                backtracking(nums, i+1);
                cur.pop_back();
            }
            //否则i++
            else
                continue;
        }
        
    }
    vector<vector<int>> findSubsequences(vector<int>& nums) {
    
    
        cur.clear();
        result.clear();
        //set为了去重,返回答案时需强制转换
        if(nums.empty())
            return vector<vector<int>>(result.begin(), result.end());
        backtracking(nums, 0);
        return vector<vector<int>>(result.begin(), result.end());
    }
};

LeetCode 46 全排列 2023.11.22

class Solution {
    
    
public:
    //成员变量存储当前答案及最终答案,set用于去重遍历数值
    vector<int> cur;
    vector<vector<int>> result;
    unordered_set<int> set;
    //递归回溯遍历
    void backtracking(vector<int> nums)
    {
    
    
        //当cur中元素个数等于数组元素个数时,说明遍历完成,将当前答案存储到最终答案中返回
        if(cur.size() == nums.size())
        {
    
    
            result.push_back(cur);
            return;
        }
        //递归回溯遍历
        for (int i = 0; i < nums.size(); i++)
        {
    
    
            //用set记录当前元素是否已经在cur中
            //如果cur中没有当前遍历元素时,则递归遍历后回溯
            if(set.find(nums[i]) == set.end())
            {
    
    
                cur.push_back(nums[i]);
                set.insert(nums[i]);
                backtracking(nums);
                cur.pop_back();
                set.erase(nums[i]);
            }
        }
        
    }
    vector<vector<int>> permute(vector<int>& nums) {
    
    
        cur.clear();
        result.clear();
        set.clear();
        if(nums.empty())
            return result;
        backtracking(nums);
        return result;
    }
};

LeetCode 47 全排列-ii 2023.11.22

class Solution {
    
    
public:
    //成员变量存储当前答案及最终答案,map用于记录重复元素及其出现次数
    vector<int> cur;
    vector<vector<int>> result;
    unordered_map<int, int> map;
    //递归回溯遍历
    void backtracking(vector<int> nums)
    {
    
    
        //当cur中元素个数等于数组元素个数时,说明遍历完成,将当前答案存储到最终答案中返回
        if(cur.size() == nums.size())
        {
    
    
            result.push_back(cur);
            return;
        }    
        //递归回溯遍历
        for (int i = 0; i < nums.size(); i++)
        {
    
    
            //当遍历元素出现次数还没用完时遍历
            if(map[nums[i]])
            {
    
    
                //当遍历元素可以再出现次数--
                map[nums[i]]--;
                cur.push_back(nums[i]);
                backtracking(nums);
                //回溯
                map[nums[i]]++;
                cur.pop_back();
            }
            //去重,相同元素的答案只遍历一次
            while (i < nums.size()-1 && nums[i] == nums[i+1])
                i++;
        }
    }

    vector<vector<int>> permuteUnique(vector<int>& nums) {
    
    
        cur.clear();
        result.clear();
        map.clear();
        //记录元素及其出现次数
        for (int i = 0; i < nums.size(); i++)
            map[nums[i]]++;
        if(nums.empty())
            return result;
        //先进行排序,为了去重
        sort(nums.begin(), nums.end());
        backtracking(nums);
        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_66706867/article/details/134551266