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];
    }
};
相关推荐
秋夫人3 分钟前
B+树(B+TREE)索引
数据结构·算法
梦想科研社38 分钟前
【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)
开发语言·算法·数学建模·matlab·无人机
Milo_K40 分钟前
今日 leetCode 15.三数之和
算法·leetcode
Darling_0043 分钟前
LeetCode_sql_day28(1767.寻找没有被执行的任务对)
sql·算法·leetcode
AlexMercer101244 分钟前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法
Greyplayground1 小时前
【算法基础实验】图论-BellmanFord最短路径
算法·图论·最短路径
蓑 羽1 小时前
力扣438 找到字符串中所有字母异位词 Java版本
java·算法·leetcode
源代码:趴菜1 小时前
LeetCode63:不同路径II
算法·leetcode·职场和发展
儿创社ErChaungClub1 小时前
解锁编程新境界:GitHub Copilot 让效率翻倍
人工智能·算法
前端西瓜哥1 小时前
贝塞尔曲线算法:求贝塞尔曲线和直线的交点
前端·算法