算法刷题Day 28 复原IP地址+子集+子集II

这篇具有很好参考价值的文章主要介绍了算法刷题Day 28 复原IP地址+子集+子集II。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Day 28 回溯算法

93. 复原IP地址

我的做法有点奇怪,还是参考一下代码随想录的做法吧

class Solution {
    vector<string> rst;
    vector<string> path;

    int str2num(const string &s)
    {
        auto iter = s.begin();
        int rst = 0;
        while (iter != s.end())
        {
            rst = rst * 10 + (*iter - '0');
            iter++;
        }

        return rst;
    }

    void backtracking(const string &s, int idx)
    {
        if (idx == s.size() && path.size() == 4)
        {
            string tmp;
            for (int i = 0; i < 4; i++)
            {
                if (i > 0)
                {
                    tmp += ".";
                }
                tmp += path[i];
            }
            rst.push_back(tmp);
        }
        else if (idx > s.size() || path.size() > 4) // 剪枝
        {
            return;
        }

        for (int i = 1; i <= 3; ++i)
        {
            string tmp = s.substr(idx, i);
            int num = str2num(tmp);
            if (num > 255) continue;
            path.push_back(tmp);
            backtracking(s, idx + i);
            path.pop_back();

            if (s[idx] == '0')
            {
                break;
            }
        }
    }

public:
    vector<string> restoreIpAddresses(string s) {
        if (s.size() < 4 || s.size() > 12) // 剪枝
        {
            return {};
        }

        rst.clear();
        path.clear();
        backtracking(s, 0);
        return rst;
    }
};

73. 子集

class Solution {
    vector<vector<int>> rst;
    vector<int> path;

    void backtracking(const vector<int> &nums, int idx)
    {
        rst.push_back(path);
        if (idx >= nums.size())
        {
            return;
        }

        for (int i = idx; i < nums.size(); ++i)
        {
            path.push_back(nums[i]);
            backtracking(nums, i + 1);
            path.pop_back();
        }
    }

public:
    vector<vector<int>> subsets(vector<int>& nums) {
        rst.clear();
        path.clear();
        backtracking(nums, 0);
        return rst;
    }
};

90. 子集II

涉及到去重,可别忘了排序

不然去重的效果没法实现文章来源地址https://www.toymoban.com/news/detail-603054.html

class Solution {
    vector<vector<int>> rst;
    vector<int> path;

    void backtracking(const vector<int> &nums, int idx)
    {
        rst.push_back(path);

        if (idx >= nums.size())
        {
            return;
        }

        for (int i = idx; i < nums.size(); ++i)
        {
            if (i > idx && nums[i] == nums[i - 1])
            {
                continue;
            }
            path.push_back(nums[i]);
            backtracking(nums, i + 1);
            path.pop_back();
        }
    }

public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        rst.clear();
        path.clear();
        // 别忘了排序,因为要去重,所以要排序
        sort(nums.begin(), nums.end());
        backtracking(nums, 0);
        return rst;
    }
};

到了这里,关于算法刷题Day 28 复原IP地址+子集+子集II的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 力扣算法刷题Day42|动态规划:01背包问题 分割等和子集

    力扣题目:01背包问题(二维数组) 刷题时长:参考题解 解题方法:动态规划 + 二维dp数组 复杂度分析 时间 空间 问题总结 理解递推公式困难 本题收获 动规思路:两层for循环,第一层i遍历物品,第二层j枚举背包容量以内所有值 确定dp数组及下标的含义:dp[i][j] 表示从下标

    2024年02月13日
    浏览(42)
  • 算法刷题Day 39 不同路径+不同路径II

    递归(深搜) 使用递归的方法超时(可以过37个case) 来分析一下时间复杂度,这个深搜的算法,其实就是要遍历整个二叉树。 这棵树的深度其实就是m+n-1(深度按从1开始计算)。 那二叉树的节点个数就是 2^(m + n - 1) - 1。可以理解深搜的算法就是遍历了整个满二叉树(其实没

    2024年02月12日
    浏览(34)
  • 算法刷题Day 29 递增子序列+全排列+全排列II

    如果直接像下面这样写的话,会出错,出错的案例类似: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9nrEEc2S-1688623883770)(LC491-递增子序列+LC.assets/image-20230703201315163.png)] 本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子

    2024年02月15日
    浏览(30)
  • 算法刷题Day 59 下一个更大元素II+接雨水

    其实也可以不扩充nums,而是在遍历的过程中模拟走了两边nums 三种方法都写了一遍 暴力方法 逐列计算 找到当前位置,左边最高的柱子的索引和右边最高的柱子的索引,两者中相对小的那个,将去当前位置的高度,就是水柱的高度,而宽度是1 超时了 双指针 提前记录好左边最

    2024年02月14日
    浏览(30)
  • 力扣算法刷题Day39|动态规划:不同路径 I&II

    力扣题目:#62.不同路径 刷题时长:参考题解后10min 解题方法:动规 复杂度分析 时间O(m*n) 空间O(m*n) 问题总结 初始化二维数组的python语法:i 对应 m,j 对应n 二维遍历顺序,从上到下从左到右通过两层for循环实现,其中startindex应为1 本题收获 动规思路 确定dp数组及下标的含义

    2024年02月12日
    浏览(46)
  • 算法刷题Day 27 组合总和+组合总和II+分割回文子串

    本题的特点是元素为可重复选取的 其实只要在原来的基础上添加一点小小的变化就是实现重复选取(与排列区别开),一时没想出来 这里与39.组合总和 (opens new window)最大的不同就是要去重了。 前面我们提到:要去重的是“同一树层上的使用过”,如何判断同一树层上元素(

    2024年02月14日
    浏览(28)
  • 力扣算法刷题Day44|动态规划:完全背包问题 零钱兑换II 组合总和Ⅳ

    力扣题目:#518.零钱兑换II(完全背包组合问题) 刷题时长:7min 解题方法:动态规划(完全背包) 复杂度分析 时间复杂度: O(mn),其中 m 是amount,n 是 coins 的长度 空间复杂度: O(m) 问题总结 对递推公式的理解 本题收获 题意转换:纯完全背包是凑成背包最大价值是多少,而本

    2024年02月13日
    浏览(31)
  • 算法刷题Day 48 打家劫舍+打家劫舍II+打家劫舍III

    分成两段来处理:比如说输入的长度是n(0~n-1),就分成[0, n - 1)和[1, n)两部分 写一个辅助函数,返回两个状态,抢或者不抢能得到的最大收获。

    2024年02月16日
    浏览(29)
  • 力扣 93. 复原 IP 地址

    题目来源:https://leetcode.cn/problems/restore-ip-addresses/description/ C++题解:递归回溯法。 递归参数:因为不能重复分割,需要ind记录下一层递归分割的起始位置;还需要一个变量num,记录ip段的数量。 递归终止条件:ip段的数量达到4 且 ind等于s的长度,可进行有效ip地址保存;当

    2024年02月12日
    浏览(29)
  • 复原 IP 地址——力扣93

    题目描述 回溯

    2024年02月13日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包