力扣爆刷第123天之回溯五连刷

2024-04-20 05:36

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

力扣爆刷第123天之回溯五连刷

文章目录

      • 力扣爆刷第123天之回溯五连刷
      • 一、77. 组合
      • 二、216. 组合总和 III
      • 三、17. 电话号码的字母组合
      • 四、39. 组合总和
      • 五、40. 组合总和 II

一、77. 组合

题目链接:https://leetcode.cn/problems/combinations/description/
思路:元素无重,不可复用,求组合数,可以早停。常规做法套模板。

class Solution {List<List<Integer>> resList = new ArrayList<>();List<Integer> list = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backTracking(n, k, 1);return resList;}void backTracking(int n, int k, int start) {if(list.size() == k) {resList.add(new ArrayList(list));return;}for(int i = start; i <= n && n - (k - list.size()) + 1 >= i; i++) {list.add(i);backTracking(n, k, i+1);list.remove(list.size()-1);}}
}

二、216. 组合总和 III

题目链接:https://leetcode.cn/problems/combination-sum-iii/description/
思路:元素无重,不可复选,要求和为n的k个数的组合,只需要简单的判断和早停,其他套模板。

class Solution {List<List<Integer>> resList = new ArrayList<>();List<Integer> list = new ArrayList<>();int sum = 0;public List<List<Integer>> combinationSum3(int k, int n) {if(k > n) return resList;backTracking(k, n, 1);return resList;}void backTracking(int k, int n, int start) {if(sum == n && list.size() == k) {resList.add(new ArrayList(list));return;}for(int i = start; i <= 9 && sum + i <= n; i++) {list.add(i);sum += i;backTracking(k, n, i+1);sum -= i;list.remove(list.size()-1);}}}

三、17. 电话号码的字母组合

题目链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/
思路:集合无重,元素不可复用,本题不同的点是所使用的集合是可以变化的,每次向下递归需要更换下一个集合。

class Solution {List<String> list = new ArrayList<>();StringBuilder builder = new StringBuilder();String[] source = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};public List<String> letterCombinations(String digits) {if(digits.equals("")) return list;backTracking(0, digits);return list;}void backTracking(int start, String digits) {if(builder.length() == digits.length()) {list.add(builder.toString());return;}String temp = source[digits.charAt(start) - '0'];for(int i = 0; i < temp.length(); i++) {builder.append(temp.charAt(i));backTracking(start+1, digits);builder.deleteCharAt(builder.length()-1);}}
}

四、39. 组合总和

题目链接:https://leetcode.cn/problems/combination-sum/description/
思路:集合无重,元素可复选,求和为K的组合数,向下递归索引位置为i不用加1,确保单个元素可以复选,排序后可以早停。其他套模板。

class Solution {List<List<Integer>> resList = new ArrayList<>();List<Integer> list = new ArrayList<>();int sum = 0;public List<List<Integer>> combinationSum(int[] candidates, int target) {Arrays.sort(candidates);backTracking(candidates, target, 0);return resList;}void backTracking(int[] candidates, int target, int start) {if(sum == target) {resList.add(new ArrayList(list));return;}for(int i = start; i < candidates.length && sum + candidates[i] <= target; i++) {sum += candidates[i];list.add(candidates[i]);backTracking(candidates, target, i);sum -= candidates[i];list.remove(list.size()-1);}}}

五、40. 组合总和 II

题目链接:https://leetcode.cn/problems/combination-sum-ii/description/
思路:集合元素有重,不可复选,求和为K的组合数,数组和排序,排序后,纵向不去重,横向去重,横向只需要大于初始索引,前后两个值想对,即去重。其他一样。

class Solution {List<List<Integer>> resList = new ArrayList<>();List<Integer> list = new ArrayList<>();int sum = 0;public List<List<Integer>> combinationSum2(int[] candidates, int target) {Arrays.sort(candidates);backTracking(candidates, target, 0);return resList;}void backTracking(int[] candidates, int target, int start) {if(sum == target) {resList.add(new ArrayList(list));return;}for(int i = start; i < candidates.length && sum + candidates[i] <= target; i++) {if(i > start && candidates[i] == candidates[i-1]) continue;sum += candidates[i];list.add(candidates[i]);backTracking(candidates, target, i+1);sum -= candidates[i];list.remove(list.size()-1);}}}

这篇关于力扣爆刷第123天之回溯五连刷的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

两数之和--力扣1

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

回溯——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,那么它的

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣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

力扣接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2: 输入:height

每日一题,力扣leetcode Hot100之238.除自身以外数组的乘积

乍一看这个题很简单,但是不能用除法,并且在O(N)时间复杂度完成或许有点难度。 考虑到不能用除法,如果我们要计算输出结果位置i的值,我们就要获取这个位置左边的乘积和右边的乘积,那么我新设立两个数组L和R。 对于L来说,由于表达的是位置i左边的数的乘积,那么L[0]=1,因为第一个数字左边没数那么为了不影响乘积初始值就设置为1,那么L[1]=L[0]*nums[0],那么L[i]=L[i-1

165-Stamps【回溯】

回溯 给h和k的意思是在k种邮票中选h个邮票 基本的连续邮资问题 15226160 165 Stamps Accepted C++ 0.062 2015-03-27 07:21:37 #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 2

力扣 797. 所有可能路径【DFS】

1. 题目 2. 代码 DFS , 直接见代码 class Solution {public:vector<int> path;vector<vector<int>> res; // 结果集void dfs(vector<vector<int>>& graph, int cur, int n){// 找出所有从节点 0 到节点 n-1 的路径// 下标从 0 开始的if (