代码编织梦想

题一:复原IP地址

题目链接: 复原IP地址
解题思路: 任何回溯过程都可以看作成一个树形结构,要抽象成一个树形结构,必须弄清楚树层和树枝是怎么构建的,在此题里,我们通过分割的方式来获得目标ip地址,for循环就代表着树枝上的构建,递归回溯就代表树层上的构建,确定递归的参数和返回值,确定终止条件,确定单次递归逻辑。此题一言两语说不清楚,我觉得最应该注意的是分割和判断是否有效那一块。
解题代码:

var isValid = function (s) {
    if(s.length === 0)return
    if ((s.length !== 1 && s.startsWith('0')) || parseInt(s) > 255) return false;
    return true;
}
var restoreIpAddresses = function (s) {
    let result = [];
    let path = [];
    if(s.length < 4)return [];
    let backtrenking = function (s, startIndex) {
        if (path.length === 3) {
            if (isValid(s.slice(startIndex, s.length))) {
                let temp = JSON.parse(JSON.stringify(path));
                temp.push(s.slice(startIndex,s.length));
                result.push(temp.join(""));
            }
            return;
        }
        for (let i = startIndex + 1; i < s.length; i++) {
            if (isValid(s.slice(startIndex, i))) {
                path.push(s.slice(startIndex, i) + '.');
                console.log(path,startIndex,i);
                backtrenking(s, i);
                path.pop();
            }else{
                return;
            }
        }
    }
    backtrenking(s,0);
    return result;
};

题二:子集

题目链接: 子集
解题思路: 一开始我以为要用一个used,但是里边没有重复的数字,所以就没必要用了,抽象成一棵树之后就是简单的递归回溯。然后还有一点需要注意的是我们在遍历的过程中是边遍历遍收集结果的。
解题代码:

var subsets = function (nums) {
    let path = [];
    let result = [[]];
    let backtrenking = function(nums,startIndex){
        if(startIndex === nums.length){
            return;
        }
        for(let i = startIndex;i<nums.length;i++){
            path.push(nums[i]);
            let temp = JSON.parse(JSON.stringify(path));
            result.push(temp);
            backtrenking(nums,i+1);
            path.pop();
        }
    }
    backtrenking(nums,0);
    return result;
};

题三:子集II

题目链接: 子集II
解题思路: 这边儿就需要用到一个used数组了,需要特别注意的一点是在单次递归遍历的逻辑里边,如果这个数字和前面那个数相等,我们到底应不应该继续往下操作,结合卡尔哥的点拨,我知道当前面那个数没有被用过的时候就不可以往下遍历,应为那恰好是被用过回溯过来的,如果接着使用则一定会出现重复的数字,如果遍历过了的话则这次遍历肯定是在树枝上,可以往下继续进行。而且这还有一点需要注意就是要把给出的nums数组先进行排序。
解题代码:

var subsetsWithDup = function (nums) {
    let path = [];
    let result = [[]];
    let used = new Array(nums.length).fill(1);
    nums.sort((a,b)=>a-b)
    let backtrenking = function (nums, startIndex) {
        if (startIndex === nums.length) return;
        for (let i = startIndex; i < nums.length; i++) {
            if (i > 0 && nums[i - 1] === nums[i] && used[i - 1] === 1)continue;
            path.push(nums[i]);
            let temp = JSON.parse(JSON.stringify(path));
            result.push(temp);
            used[i] = 0;
            backtrenking(nums, i + 1);
            path.pop();
            used[i] = 1;
        }
    }
    backtrenking(nums, 0);
    return result;
};
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/MZYJP/article/details/127993052

打卡代码随想录Day5-爱代码爱编程

今天进入队列和栈的学习。 1.括号匹配问题(力扣20) public boolean isValid(String s) { if(s.length()<=1) return false; Stack<Character> stack = new Stack<>(); for (in

打开代码随想录Day12-爱代码爱编程

今天准备结束回溯的学习。首先遇到的就是一个hard,但是其实并不难,只是开始对题的理解有了偏差浪费了很多时间,最终3个小时才完成。 1.重新安排行程(力扣332) 本题首先注意同一个行程可能在给定数组出现了多次,对于这种关系到频率的要用map存放,保证不重复用,其次由于返回的答案要是字典排序的最小值,我们首先要对给定数组进行排序,这样一来得到的第一个满

打卡代码随想录Day6-爱代码爱编程

今天进入二叉树的学习,继续夯实基础。 1.二叉树的前序、后序、中序遍历(力扣144、145、94) public List<Integer> preorderTraversal(TreeNode root) { ArrayList<Integer> res = new ArrayList<>(); t

代码随想录day4打卡_foamyfoamy的博客-爱代码爱编程

代码随想录day4打卡 24两两交换链表中的节点19删除链表的倒数第N个节点面试题0207链表相交142环形链表II 24两两交换链表中的节点 24两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,

代码随想录day28|93. 复原 ip 地址|78.子集|90.子集ii|golang_扣1送肥猫的博客-爱代码爱编程

代码随想录day28 目录 93. 复原 IP 地址 78.子集 90.子集II 93. 复原 IP 地址   思路:                 做这道题目之前,最好先把131.分割回文串这个做了。这道题目相信大家刚看的时候,应该会一脸茫然。         其实只要意识到这是切割问题,切割问题就可以使用回溯搜索法把所有可

代码随想录训练营day28_jiuyu_m的博客-爱代码爱编程

目录 题目一:复原IP地址  解法: 题目二:子集问题 解法: 题目三:子集问题|| 解法:  题目一:复原IP地址 力扣题目链接 题目描述:有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。 给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返

代码随想录 day14_fremount的博客-爱代码爱编程

1.理论基础 1.1 二叉树的种类 满二叉树:叶子节点那一排全排满的树 完全二叉树:除叶子节点外全排满的树,且叶子节点要是连续的 二叉搜索树:头节点>左节点>右节点的树,中序遍历下来是一串递增的数值

代码随想录 day21_fremount的博客-爱代码爱编程

题一: 二叉搜索树的最小绝对差 题目链接:二叉搜索树的最小绝对差 解题思路: 中序遍历二叉搜索树得到有序数组,然后利用双指针cur pre算出最小绝对差。 解题代码: var getMinimumDifference =

代码随想录 day22_fremount的博客-爱代码爱编程

题一:二叉搜索树的最近公共祖先 题目链接: 二叉搜索树的最近公共祖先 解题思路: 跟二叉数的最近公共祖先的解题思路差不多,但这里有一点是,确定一个节点在给出节点q、p的中间的时候,这个节点一定是最近公共祖先。 解题代码:

代码随想录day6_rebeccababy的博客-爱代码爱编程

   349 两个数组的交集    #之前做过,忘记用什么思路做了。这次很容易做出来了,但好像和hash没啥关系         stack = []         for i in nums1:             if i in nums2:                 stack.append(i)         return set(

代码随想录 day25_fremount的博客-爱代码爱编程

题一:数组总和III 题目链接: 数组总和III 解题思路: 把解题过程抽象成一颗构造好的树,采用深度优先遍历的思想(方便我们回溯),具体的解题树见代码随想录视频,在最后一步终止递归的时候,需要通过路径判断sum和给定值是

代码随想录 day27_fremount的博客-爱代码爱编程

题一:组合总和 题目链接: 组合总和 解题思路: 注意同一个数字可以无限制重复被选取,但组合不能重复,还是老套路,从第一个数开始深度搜索遍历,记录sum,记录path,递归,还原sum,还原path,再往右遍历。 解题代码

代码随想录 day29_fremount的博客-爱代码爱编程

题一:递增子序列 题目链接: 递增子序列 解题思路: 这道题很难受的一个地方就是不能排序,不然跟求子集差不多,题目要求是递增的,且要大于俩个的才算是递增子序列。一开始我还是以老思路,设置一个全局的used来去重过滤,但是这

代码随想录 day04-爱代码爱编程

代码随想录 Day04 代码随想录 相应链接 24. 两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 cl

代码随想录day26-爱代码爱编程

代码随想录day26 分割回文串题目题解注意 分割回文串 题目 题解 注意 1.当字符串的起始位置和终止位置相同时,代表的是字符串中起始位置的字符,而非空字符,可以通过输出此时的字符

代码随想录 day13-爱代码爱编程

题一:滑动窗口的最大值 题目链接: 滑动窗口的最大值 解题思路: 给定宽度的滑动窗口,从头到尾按这个窗口的长度遍历这个数组,并求出每次的最大元素,最后以数组的形式返回。其实用暴力解法挺容易的,窗口每移动一次就做一次排序操作

代码随想录day28 | 93、78、90_《代码随想录》 (opens new window)。-爱代码爱编程

目录 93. 复原 IP 地址 78. 子集 分析: 代码: 代码随想录: 疑问:  复杂度分析: 总结: 90. 子集 II 分析 三个去重的方法: 复杂度分析: 93. 复原 IP 地址 分析: 每个整数位于 0 到 255 之间组成,且不能含有前导 0以上面为依据,进行判断是否合法,分割是遍历的,每一种情况都会出

代码随想录day28|93.复原ip地址、78.子集、90.子集ii_leetcode93题:复原ip地址 代码随想录-爱代码爱编程

文章目录 93.复原IP地址78.子集90.子集II 93.复原IP地址 文章讲解:代码随想录 (programmercarl.com) 视频讲解:93.复原IP地址 题目链接:93. 复原 I