LeetCode热题100刷题10:46. 全排列、78. 子集、17. 电话号码的字母组合、39. 组合总和、138. 随机链表的复制

回溯问题

46. 全排列

全排列问题:

path

递归终止条件:path中是否已存储所有元素;

for循环处理节点集合:used=0未被使用的元素

cpp 复制代码
class Solution {
public:
    vector<int> path;
    vector<vector<int>> res;

    void backtracking(vector<int>& nums,vector<bool>& used) {
        if(path.size() == nums.size()){
            res.push_back(path);
            return;
        }
        
        for(int i=0;i<nums.size();i++) {
            if(used[i]==true)
                continue;
            
            path.push_back(nums[i]);
            used[i]=true;
            backtracking(nums,used);
            used[i]=false;
            path.pop_back();

        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<bool> used(nums.size(),false);
        backtracking(nums,used);
        return res;
    }
};

78. 子集

子集问题:

每个集合都需要存储到res中,

递归终止条件:可以省略,startIndex下标到达数组末尾 与for循环的条件判断一致

for循环处理的元素集合,startIndex-数组最后一个元素

cpp 复制代码
class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void backtracking(vector<int>& nums,int startIndex) {
        
        res.push_back(path);
        for(int i=startIndex;i<nums.size();i++) {
            path.push_back(nums[i]);
            backtracking(nums,i+1);
            path.pop_back();
        }
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        backtracking(nums,0);
        return res;
    }
};

17. 电话号码的字母组合

这个题根据digits中给出的数字字符,从而锁定对应的字符串,对字符串中的字母进行组合,前面复习过两遍,对这个题的印象还不是很清晰,故再写一次题解:

cpp 复制代码
class Solution {
    const string strSet[10] = {
        "",
        "",
        "abc",
        "def",
        "ghi",
        "jkl",
        "mno",
        "pqrs",
        "tuv",
        "wxyz"
    };
public:
    string s;
    vector<string> res;
    void backtracking(const string& digits,int index) {
        if(index == digits.size()) {
            res.push_back(s);
            return;
        }
        int digit = digits[index]-'0';
        string str = strSet[digit];
        for(int i=0;i<str.size();i++) {
            s.push_back(str[i]);
            backtracking(digits,index+1);
            s.pop_back();
        }
    }
    vector<string> letterCombinations(string digits) {
        if(digits.size()==0)
            return res;
        backtracking(digits,0);
        return res;

    }
};

39. 组合总和

元素可以多次使用,下一次元素集合的开始位置可以还是startIndex

cpp 复制代码
class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void backtracking(vector<int>& candidates,int target,int sum,int startIndex) {
        if(sum > target)
            return;
        if(sum == target) {
            res.push_back(path);
            return;
        }
        for(int i=startIndex;i<candidates.size();i++) {
            path.push_back(candidates[i]);
            sum+=candidates[i];
            backtracking(candidates,target,sum,i);
            sum-=candidates[i];
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        int sum=0;
        backtracking(candidates,target,sum,0);
        return res;
    }
};

138. 随机链表的复制

cpp 复制代码
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
public:
    unordered_map<Node*,Node*> cachedNode;

    Node* copyRandomList(Node* head) {
        if(head == nullptr)
            return nullptr;
        //如果当前节点没有被拷贝
        if(!cachedNode.count(head)) {
            //新定义节点headNew保存val,
            Node* headNew = new Node(head->val);
            cachedNode[head] = headNew;
            //head->next 和head->random要先存在了才能指过去
            //利用递归完成headNew的后继节点next和随机指向节点random的拷贝
            headNew->next = copyRandomList(head->next);
            headNew->random = copyRandomList(head->random);
        }
        return cachedNode[head];
    }
};
相关推荐
南宫生2 分钟前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
不想当程序猿_14 分钟前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
落魄君子25 分钟前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
冷眼看人间恩怨31 分钟前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
菜鸡中的奋斗鸡→挣扎鸡33 分钟前
滑动窗口 + 算法复习
数据结构·算法
红龙创客40 分钟前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin42 分钟前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
郭wes代码1 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
scan7241 小时前
LILAC采样算法
人工智能·算法·机器学习
菌菌的快乐生活1 小时前
理解支持向量机
算法·机器学习·支持向量机