力扣labuladong一刷day67天回溯大集合

2024-01-25 12:52

本文主要是介绍力扣labuladong一刷day67天回溯大集合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

力扣labuladong一刷day67天回溯大集合

文章目录

      • 力扣labuladong一刷day67天回溯大集合
      • 一、93. 复原 IP 地址
      • 二、78. 子集
      • 三、90. 子集 II

一、93. 复原 IP 地址

题目链接:https://leetcode.cn/problems/restore-ip-addresses/description/
思路:分割字符串和排序数字其实是差不多的,分割出来的IP地址是讲究顺序的,所以也不用考虑去重,正常回溯模板即可,另外就是剪枝早停,可以节省时间,截了3个数了,最后一个4位数超3位了直接停止,能节省不少时间。类始于之前的题目分割回文串,要求返回所有的分割方案,也是不需要去重的,分割aaa,为a,aa和aa,a这是两种分割方案。

class Solution {List<String> list;List<String> arrayList;public List<String> restoreIpAddresses(String s) {list = new ArrayList<>();arrayList = new ArrayList<>();backTracking(s, 0);return arrayList;}void backTracking(String s, int index) {if (list.size() == 4) {if (index == s.length()) {String join = String.join(".", list);arrayList.add(join);}return;}for (int i = index; i < s.length(); i++) {if (list.size() == 3 && i-index > 2) return;String temp = isTrue(s, index, i + 1);if (temp == null) continue;list.add(temp);backTracking(s, i+1);list.remove(list.size()-1);}}String isTrue(String s, int i, int j) {if (i == j-1) {return String.valueOf(s.charAt(i));}if (s.charAt(i) == '0' || j-i > 3) return null;String temp = s.substring(i, j);if (Integer.valueOf(temp) > 255) return null;return temp;}
}

二、78. 子集

题目链接:https://leetcode.cn/problems/subsets/description/
思路:子集问题求所有子集,元素不重复,要求子集也不重复,只需要index每次加一即可。另外求的是全部子集,故需要在所有节点搜集元素,而不是叶子节点。注意这一点即可。组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点。

class Solution {List<Integer> list;List<List<Integer>> arrayLists;public List<List<Integer>> subsets(int[] nums) {list = new ArrayList<>();arrayLists = new ArrayList<>();backTracking(nums, 0);return arrayLists;}void backTracking(int[] nums, int index) {arrayLists.add(new ArrayList<>(list));for (int i = index; i < nums.length; i++) {list.add(nums[i]);backTracking(nums, i+1);list.remove(list.size()-1);}}
}

三、90. 子集 II

题目链接:https://leetcode.cn/problems/subsets-ii/description/
思路:本题的子集是如nums = [1,2,2]这种,包含重复元素,单个元素不可重复选,要求子集无重,不可重复选只需要index每次加一即可,要求子集无重,就需要横向去重,在同一个树层,相同的元素左边的孩子用了,右边的就不能用了,有一个技巧,需要排序,让相同的数都挨着,通过if (i > index && nums[i] == nums[i-1]) continue;进行跳过。

class Solution {List<List<Integer>> arrayLists;List<Integer> list;public List<List<Integer>> subsetsWithDup(int[] nums) {arrayLists = new ArrayList<>();list = new ArrayList<>();Arrays.sort(nums);backTracking(nums, 0);return arrayLists;}void backTracking(int[] nums, int index) {arrayLists.add(new ArrayList<>(list));for (int i = index; i < nums.length; i++) {if (i > index && nums[i] == nums[i-1]) continue;list.add(nums[i]);backTracking(nums, i+1);list.remove(list.size()-1);}}
}

这篇关于力扣labuladong一刷day67天回溯大集合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/643326

相关文章

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

Java基础回顾系列-第六天-Java集合

Java基础回顾系列-第六天-Java集合 集合概述数组的弊端集合框架的优点Java集合关系图集合框架体系图java.util.Collection接口 List集合java.util.List接口java.util.ArrayListjava.util.LinkedListjava.util.Vector Set集合java.util.Set接口java.util.HashSetjava

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

回溯——9.全排列

力扣题目链接 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解题思路 问题建模:题目要求给出一个数组的所有排列组合,属于典型的全排列问题,这可以用回溯法来解决。回溯法通过递归的方式,依次将数组中的每个元素放入排列中,直到生成

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

java集合的概述

集合就是一个容器,我们可以把多个对象放入的容器中。就像水杯(假设容量可以不断扩大)一样,你可以往水杯中不断地添加水,既然是水杯,你就不能往里添加沙子,也就是说集合中添加的对象必须是同一个类型的(引用类型,而不能是基本类型)。 看到集合的介绍会让我们的想起数组,那么集合和数组有什么区别呢? 首先,数组的大小是固定的,而集合理论上大小是不限的。 其次,数组既可以存储基本数据类型的数据,也可以存储

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,

力扣 739. 每日温度【经典单调栈题目】

1. 题目 理解题意: 1.1. 给一个温度集合, 要返回一个对应长度的结果集合, 这个结果集合里面的元素 i 是 当前 i 位置的元素的下一个更高温度的元素的位置和当前 i 位置的距离之差, 若是当前元素不存在下一个更高温度的元素, 则这个位置用0代替; 2. 思路 本题用单调栈来求解;单调栈就适用于来求当前元素左边或者右边第一个比当前元素大或者小的元素;【单调栈:让栈中的元素保持单调

风控系统之指标回溯,历史数据重跑

个人博客:无奈何杨(wnhyang) 个人语雀:wnhyang 共享语雀:在线知识共享 Github:wnhyang - Overview 回顾 默认你已经看过之前那篇风控系统指标计算/特征提取分析与实现01,Redis、Zset、模版方法。 其中已经介绍了如何利用redis的zset结构完成指标计算,为了方便这篇文章的介绍,还是在正式开始本篇之前回顾一下。 时间窗口 zset