代码随想录算法训练营第20天回溯系列

2023-05-16

代码随想录算法训练营第1天|704. 二分查找、27. 移除元素

39. 组合总和

题目链接

提交代码

class Solution {
public:
    vector<int> path;
    vector<vector<int>> result;
    void backtracking(vector<int> candidates, int index, int sum, int target)
    {
        if(target < sum) return;

        if(target == sum)
        {
            result.push_back(path);
            return;
        }
        for(int i = index; i < candidates.size() && sum + candidates[i] <= target; i++)
        {
            path.push_back(candidates[i]);
            sum += candidates[i];
            backtracking(candidates, i, sum, target);
            sum -= candidates[i];
            path.pop_back();
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(), candidates.end());
        backtracking(candidates, 0, 0, target);  
        return result;
    }
};

40. 组合总和II

题目链接

提交代码

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used) {
        if (sum == target) {
            result.push_back(path);
            return;
        }
        for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {
            if(i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) continue;
            sum += candidates[i];
            path.push_back(candidates[i]);
            used[i] = true;
            backtracking(candidates, target, sum, i + 1, used); // 不用i+1了,表示可以重复读取当前的数
            used[i] = false;
            sum -= candidates[i];
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        result.clear();
        path.clear();
        vector<bool> used(candidates.size(), false);
        sort(candidates.begin(), candidates.end());
        backtracking(candidates, target, 0, 0, used);
        return result;
    }
};

131.分割回文串

题目链接

提交代码

class Solution {
public:
    vector<vector<string>> result;
    vector<string> path;

    bool ispal(string s, int start, int end)
    {
        for(int i = start, j = end; i < j; i++, j--)
            if(s[i] != s[j])
                return false;
        return true;
    }
    void backtracking(string s, int index)
    {
        if(index == s.size())
        {
            result.push_back(path);
            return;
        }
        for(int i = index; i < s.size(); i++)
        {
            if(ispal(s, index, i))
            {
                string substr = s.substr(index, i - index + 1);
                path.push_back(substr);
            }
            else
                continue;
            backtracking(s, i + 1);
            path.pop_back();
        }
    }
    vector<vector<string>> partition(string s) {
        backtracking(s, 0);
        return result;
    }
};

93.复原IP地址

题目链接

提交代码

class Solution {
public:
    vector<string> result;
    string path;
    void  backtracking(string s, int index, int count)
    {
        if(index == s.size() && count == 4)
        {
            result.push_back(path);
            return;
        }
        if(count >= 4) return;
        for(int i = index; i < s.size(); i++)
        {
            if(isillegal(s, index, i))
                continue;
            path += s.substr(index, i - index + 1);
            if(count < 3) path += ".";
            if(count + 1 > 4) continue;
            backtracking(s, i + 1, count + 1);
            int size = i - index + 1;
            if(count < 3) size++;
            while(size--) path.pop_back();
        }
    }
    bool isillegal(string s, int left, int right)
    {
        if(right - left + 1 > 3 || right - left + 1 <= 0) return true;
        string substr = s.substr(left, right - left + 1);
        vector<int> nums;
        for(int i = 0; i < substr.size(); i++)
        {
            int num = substr[i] - '0';
            nums.push_back(num);
        }
        if(nums[0] == 0 && nums.size() > 1) return true;
        int sum = 0;
        for(int num:nums)
            sum = 10 * sum + num;
        if(sum > 255 || sum < 0) return true; 
        return false;
    }
    vector<string> restoreIpAddresses(string s) {
        int count = 0;
        backtracking(s, 0, count);
        return result;
    }
};

78.子集

题目链接

提交代码

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

90.子集II

题目链接

提交代码

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int> nums, int startIndex, vector<bool>& used)
    {
        result.push_back(path);
        for(int i = startIndex; i < nums.size(); i++)
        { 
            if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) continue;
            path.push_back(nums[i]);
            used[i] = true;
            backtracking(nums, i + 1, used);
            used[i] = false;
            path.pop_back();
        }
    }
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<bool> used(nums.size(), false);
        backtracking(nums, 0, used);
        return result;
    }
};

46.全排列

题目链接

提交代码

class Solution {
public:
    vector<int> path;
    vector<vector<int>> result;
    void backtracking(vector<int> nums, vector<bool> used)
    {
        if(path.size() == nums.size())
            result.push_back(path);
        for(int i = 0; i < nums.size(); i++)
        {
            if(used[i] == false)
                path.push_back(nums[i]);
            else 
                continue;
            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 result;
    }
};

47全排列II

题目链接

提交代码

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int> nums, vector<bool> used)
    {
        if(path.size() == nums.size())
        {
            result.push_back(path);
            return;
        }
        for(int i = 0; i < nums.size(); i++)
        {
            if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) continue;
            if(used[i]) continue;
            used[i] = true;
            path.push_back(nums[i]);
            backtracking(nums, used);
            used[i] = false;
            path.pop_back();
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<bool> used(nums.size(), false);
        sort(nums.begin(), nums.end());
        backtracking(nums, used);
        return result;
    }
};

491.递增子序列

题目链接

提交代码

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int> nums, int startIndex)
    {
        if(path.size() >= 2)
            result.push_back(path);
        unordered_set<int> set;
        for(int i = startIndex; i < nums.size(); i++)
        { 
            if((!path.empty() && nums[i] < path[path.size() - 1]) || set.find(nums[i]) != set.end()) continue;
            path.push_back(nums[i]);
            set.insert(nums[i]);
            backtracking(nums, i + 1);
            path.pop_back();
        }
    }
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        vector<bool> used(nums.size());
        backtracking(nums, 0);
        return result;
    } 
};

332.重新安排行程

题目链接

提交代码

class Solution {
public:
    vector<string> result;
    vector<vector<string>> allResults;
    void backtracking(vector<vector<string>>& tickets, vector<bool> used, string end)
    {
        if(result.size() == tickets.size() + 1)
        {
            allResults.push_back(result);
            return;
        }
        for(int i = 0; i < tickets.size(); i++)
        {
            if(used[i] == true) continue;
            if(tickets[i][0] == end)
                used[i] = true;
            else 
                continue;
            result.push_back(tickets[i][1]);
            backtracking(tickets, used, tickets[i][1]);
            result.pop_back();
        }
    }
    vector<string> findItinerary(vector<vector<string>>& tickets) {
        vector<bool> used(tickets.size(), false);
        string end = "JFK";
        result.push_back(end);
        backtracking(tickets, used, end);
        //sort(allResults.begin(), allResults.end());
        //return allResults[0];
        return result;    
    }
};

51.N皇后

题目链接

提交代码

class Solution {
public:
    vector<vector<string>> result;
    void backtracking(vector<string>& chessboard, int n, int row)
    {
        if(row == n)
        {
            result.push_back(chessboard);
            return;
        }
        for(int j = 0; j < n; j++)
        {
            if(isvalid(chessboard, row, j))
            {
                chessboard[row][j] = 'Q';
                backtracking(chessboard, n , row + 1);
                chessboard[row][j] = '.';
            }
        }
    }
    bool isvalid(vector<string>& chessboard, int i, int j)
    {
        //检查列有没有重复的
        int n = chessboard.size();
        for(int k = 0; k < chessboard.size(); k++)
            if(chessboard[k][j] == 'Q') return false;
        //检查45度有没有重复的
        for(int curi = i - 1, curj = j - 1; curi >= 0 && curj >= 0; curi--, curj--)
            if(chessboard[curi][curj] == 'Q') return false;
        //检查135度有没有重复的
        for(int curi = i - 1, curj = j + 1; curi >= 0 && curj < n; curi--, curj++)
            if(chessboard[curi][curj] == 'Q') return false;
        return true;
    }
    vector<vector<string>> solveNQueens(int n) { 
    vector<string> chessboard(n, string(n, '.'));
    backtracking(chessboard, n, 0);
    return result;    
    }
};

37.解数独

题目链接

提交代码

class Solution {
public:
    bool backtracking(vector<vector<char>>& board)
    {
        for(int i = 0; i < board.size(); i++)
        {
            for(int j = 0; j < board[0].size(); j++)
            {
                if(board[i][j] == '.')
                {
                   for(char ch = '1'; ch <= '9'; ch++)
                   {
                       if(isValid(i, j, ch, board))
                       {
                           board[i][j] = ch;
                           bool result = backtracking(board);
                           if(result) return true;
                           board[i][j] = '.';
                       }
                   } 
                   return false;
                }
            }
        }
        return true;
    }
    
bool isValid(int row, int col, char val, vector<vector<char>>& board) {
    //检查列
    for(int i = 0; i < board.size(); i++)
        if(board[i][col] == val) return false;
    //检查行
    for(int j = 0; j < board[0].size(); j++)
        if(board[row][j] == val) return false;
    //检查每个9 * 9的格子
    int startx = (row / 3) * 3;
    int starty = (col / 3) * 3;
    int endx = (row / 3 ) * 3 + 3;
    int endy = (col / 3 ) * 3 + 3;
    for(int i = startx; i < endx; i++)
    {
        for(int j = starty; j < endy; j++)
        {
            if(board[i][j] == val)
                return false;
        }
    }
    return true;
}
    void solveSudoku(vector<vector<char>>& board) {
        backtracking(board);
    }
};

总结

                     日期: 2023 年 4 月 11 日
              学习时长: 5 h 30 m
                     难度: ★ \bigstar
累计完成题目数量: 76
距离目标还有数量: 224
                      小结:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码随想录算法训练营第20天回溯系列 的相关文章

  • python二级考试-每日刷题7

    知识导图 文件 文件的类型 文件的打开和关闭 文件的读写
  • 树莓派入门(笔记本当显示屏)

    树莓派入门 笔记本当显示屏 your elephant的博客 CSDN博客 树莓派连接笔记本屏幕
  • python-sklearn实现神经网络(数据量小的情况)

    以下内容笔记出自 跟着迪哥学python数据分析与机器学习实战 xff0c 外加个人整理添加 xff0c 仅供个人复习使用 神经网络 xff08 neural network 模块重要的有两个类 xff0c MLPClassifier 分类
  • 想免像控?RTK/PPK无人机 vs GCP 测绘精度对比

    无人机航拍测绘具有精度高 作业效率高 数据分析能力强的特点 xff0c 很大程度上解决了人工测绘的痛点 因此 xff0c 无人机在测绘工程中的应用越来越广泛 精度对于测绘从业人员来说精度至关重要 xff0c 针对RTK PPK 无人机和使用
  • ROS的GPS驱动包

    ROS WiKi地址 http wiki ros org nmea gps driver ROS功能包 xff1a nmea gps driver Package to parse NMEA strings and publish a ve
  • 【操作系统】进程切换到底是怎么个过程?

    首先 xff0c 我们要了解 xff0c 进程切换是个什么过程 xff1f 进程切换概念 其实很简单 xff0c 进程切换就是从正在运行的进程中 xff0c 收回CPU的使用权利 xff0c 交给下一个要运行的进程 实际上 xff0c 因为
  • docker设置多个环境变量

    在命令行直接使用 e或 env xff0c env file xff0c 每个变量写一次 e 2 在dockerfile里设置 这里键值是以空格分开的
  • 一些好用的c++ STL库函数

    stl可以说是懒癌患者福利了 持续更新 xff08 随缘更新 xff09 全排列函数next permutation 今天在洛谷做题的时候发现一个题简直是这个函数的完美应用 题目链接 xff1a 洛谷P1088 火星人 头文件 xff1a
  • 【FreeRTOS】中断机制

    FreeRTOS 之中断机制 在FreeRTOS中 xff0c 中断是实现实时性必要的操作 一款芯片的中断涉及到硬件触发 xff0c 软件触发 xff0c 软件中断处理 所以FreeRTOS的中断机制其实不好单独拿出来看 FreeRTOS关
  • 【VSPD虚拟串口】【Modbus Poll】【Modbus Slave】仿真工具的学习过程

    学习想法 xff1a 通信是工控行业内采集仪器仪表等设备信息的重要途径 xff0c 同时可以通过通信访问设备的工作状况对设备进行监控 xff0c 也可以通过通信对设备进行参数修改以及控制设备运行 xff0c 所以掌握通信是工控行业人员比不可
  • 【RISC-V】Trap和Exception

    文章目录 控制流 xff08 Control Flow xff09 和TrapRISC V Trap处理中涉及的寄存器mtvec Machine Trap Vector Base Address mepc Machine Exception
  • @TableId(type = IdType.AUTO)不生效问题

    随手记录一下 64 TableId type 61 IdType AUTO private Long id Cause java sql SQLException Field 39 id 39 doesn 39 t have a defau
  • Docker apt-get update报错

    在Docker改apt源出现问题 root 64 1ad3e492d821 etc apt apt get update Ign 1 http mirrors 163 com debian stretch InReleaseGet 2 ht
  • c语言 面试前必备基础知识

    目录 c语言 数据类型c语言 数据类型打印格式 c s d f lf p x o lu lldc语言 格式化输出 md 0md m nf c语言 常用字符的ASCII值c语言 变量 常量c语言 变量c语言 变量命名规范c语言 变量存储类型
  • **make[2]: *** [CMakeFiles/offb_node.dir/build.make:84:报错解决

    make报错很有可能是因为CmakeList里面的文件没有修改好 xff01 如果是cpp文件的话需要修改下面两部分 xff1a 1 修改的第一处 xff1a 把节点修改成自己文件的节点就可以 2 修改的第二处 xff1a
  • Ubuntu18.04下ROS+Gazebo+Mavros+PX4安装教程(最新!最全!)

    一 依赖安装 span class token function sudo span span class token function apt span span class token function install span nin
  • 在Gazebo仿真中修改仿真环境 (World)

    这一步是要把初始环境改成白色地板环境 xff0c 跑仿真或者基于地标降落的时候更容易观察 xff0c 让人看着也比较舒服 这一步只需要修改下面代码 原代码 xff1a xff08 初始环境 xff09 span class token op
  • 关于Arduino、树莓派和 Pixhawk微处理器对比分析

    摘要 xff1a Arduino是一款基于微控制器 xff08 单片机 xff09 的电子开发板 xff0c 它可以运行一些相对比较简单的应用程序 包含硬件 xff08 各种型号的Arduino板 xff09 和软件 xff08 Ardui
  • 关于STARMAC旋翼机的计算系统组成分析

    摘要 xff1a STARMAC xff0c 全称为 the Stanford Testbed of Autonomous Rotorcraft for Multi Agent Control xff0c 是斯坦福大学为为了突破先前飞行器笨
  • 读史铁生随笔摘要

    人可以走向天堂 xff0c 不可以走到天堂 物质的天堂注定难为 xff0c 而精神的天堂恰于走向中成立 永远的限制是其永远成立的依据 无所眺望或有所眺望都证明到达之地并非圆满 xff0c 而你若永远地走向它 xff0c 你便随时都在它的光照

随机推荐

  • IMAX B6电路原理详解

    IMAX B6电路原理详解 本文出自 手电大家谈 xff0c 原帖 xff1a http www shoudian org thread 447417 1 1 html
  • arduino实验第三代码

    include lt avr eeprom h gt define PinA 2 中断0 define led1 1 define led2 3 define led3 4 define led4 5 define da 6 define
  • pytorch总结——1:初步introduction

    pytorch简介 先说Torch xff0c 这是一个与Numpy类似的张量 xff08 Tensor xff09 操作库 xff0c 与Numpy不同的是Torch对GPU支持的很好 xff0c Lua是Torch的上层包装 但是Lua
  • pytorch_RNN相关函数介绍

    1 RNN背景介绍 RNN结构 参数介绍 input size 输入x的特征数量 hiddien size 隐藏层的特征数量 num layers RNN的层数 nonlinearity 指定激活函数是tanh还是relu xff0c 默认
  • 一些tensorflow-VIN 的笔记

    1tensorflow 使用flags定义命令行参数 2 product的执行 3 xff0c round函数 保留小数点后几位 96 a 61 1 12345 result 61 round a 2 print result 1 12 4
  • rosbag录制固定话题,多话题等

    ROS框架下可以很方便的进行数据记录 并且将其转换为txt文件进行matlab处理 下面介绍一下rosbag的日常使用方法 1 查找你所需要的话题 xff1a rostopic list 在ros节点开启的情况下 span class to
  • 相机与IMU标定教程

    标定教程 way 相机与IMU联合标定 1 imu utils 标定IMU的内参 1 imu utils标定IMU的内参 xff0c 可以校准IMU的噪声密度和随机游走噪声 2 kalibr包标定相机的内外参数 xff0c 相机与IMU之间
  • 如何在Win11中安装wsl Ubuntu系统

    目录 前言正文一 环境二 在 Windows 11 上启用 WSL四 按照官方文档进行安装五 安装ubuntu系统六 下载vcxSrv七 运行wsl八 总结 参考 前言 在笔记本上安装一下环境 xff0c 便于平常的工作 正文 一 环境 w
  • 下载PX4固件时网络太慢,经常出现克隆失败

    下载PX4固件时 xff0c 官网给的指令是 git clone https github com PX4 PX4 Autopilot git recursive 需要进行循环克隆 xff0c 在克隆过程中可能出现以下的情况 无法克隆 39
  • roslaunch mavros px4.launch 出现的问题

    在运行roslaunch mavros px4 launch fcu url 61 udp 14540 64 127 0 0 1t 14557 时出现了以下错误 xff0c 这是由于 符号是中文符号导致的 xff0c 切换成英文的即可 RL
  • 解决Ubuntu执行sudo命令后提示无法解析主机

    解决Ubuntu执行sudo命令后提示无法解析主机 异常现象异常原因查看修改主机名普通用户与管理员间的切换 异常现象 异常原因 etc hostname和 etc hosts文件中主机名称不一致导致 xff0c 将其修改一致即可 修改此文件
  • rosdep update 指令超时问题

    在执行rosdep update后出现超时问题 xff0c 报如下错误 reading in sources list data from etc ros rosdep sources list d ERROR unable to proc
  • 使用git --recursive进行循环克隆,由于网络原因,出现克隆失败的情况。

    git clone recursive 用于循环克隆git子项目 xff0c 但由于网络原因 xff0c 经常会出现克隆失败的情况 xff0c 这时不得不删掉克隆文件夹 xff0c 全部重新来过 xff0c 我们可以先将主文件克隆下来 xf
  • minimumsnap(1)微分平坦特性(Differential Flatness)

    本文内容参考论文 Minimum Snap Trajectory Generation and Control for Quadrotors Daniel Mellinger and Vijay Kumar 从名字可以看出 xff0c 我们
  • 未安装Ceres

    编译VINs的时候 xff0c 遇到了这个问题 xff0c 是没安装Ceres导致的 96 CMake Error at VINS Mono camera model CMakeLists txt 19 find package By no
  • 费雪信息场增量建场实际实验

    写在前面 上一阶段的工作是基础是在张子潮大佬的费雪信息场这几篇论文的基础上进行的 Beyond Point Clouds Fisher Information Field for Active Visual Localization Zic
  • XTDrone+VINs+fast-planner

    接下来的工作需要把XTDrone VINS和fast planner集成到一起 在XTDrone集成VINs按照XTDrone使用手册来就可以了 xff0c 按照仿真平台基础配置 xff0c PX4飞控与EKF配置和视觉惯性里程计 xff0
  • 代码随想录算法训练营第19天|77. 组合

    代码随想录算法训练营第19天 77 组合 77 组合 题目链接 提交代码 span class token keyword class span span class token class name Solution span span
  • 【无标题】

    代码随想录算法训练营第1天 216 组合总和III 17 电话号码的字母组合 216 组合总和III 题目链接 提交代码 span class token keyword class span span class token class
  • 代码随想录算法训练营第20天回溯系列

    代码随想录算法训练营第1天 704 二分查找 27 移除元素 39 组合总和 题目链接 提交代码 span class token keyword class span span class token class name Solutio