【代码随想录——回溯算法二周目】

1. 组合总和

在这里插入图片描述

var (path []intres  [][]int
)func combinationSum(candidates []int, target int) [][]int {path = make([]int, 0)res = make([][]int, 0)dfs(candidates,target,0,0)return res
}func dfs(candidates []int, target int,tempTarget int,start int)  {if tempTarget>target{return}if tempTarget==target{temp := make([]int,len(path))copy(temp,path)res = append(res, temp)return}for i:=start;i<len(candidates);i++{path = append(path, candidates[i])dfs(candidates,target,tempTarget+candidates[i],i)path = path[:len(path)-1]}
}

2. 组合总和2

在这里插入图片描述
需要先对候选人进行一个排序

2.1 使用used数组

var (res [][]intpath  []intused  []bool
)
func combinationSum2(candidates []int, target int) [][]int {res, path = make([][]int, 0), make([]int, 0, len(candidates))used = make([]bool, len(candidates))sort.Ints(candidates)   // 排序,为剪枝做准备dfs(candidates, 0, target)return res
}func dfs(candidates []int, start int, target int) {if target == 0 {   // target 不断减小,如果为0说明达到了目标值tmp := make([]int, len(path))copy(tmp, path)res = append(res, tmp)return}for i := start; i < len(candidates); i++ {if candidates[i] > target {  // 剪枝,提前返回break}// used[i - 1] == true,说明同一树枝candidates[i - 1]使用过// used[i - 1] == false,说明同一树层candidates[i - 1]使用过if i > 0 && candidates[i] == candidates[i-1]  && used[i-1] == false { continue}path = append(path, candidates[i])used[i] = truedfs(candidates, i+1, target - candidates[i])used[i] = falsepath = path[:len(path) - 1]}
}

2.2 不使用used数组

var (res [][]intpath  []int
)
func combinationSum2(candidates []int, target int) [][]int {res, path = make([][]int, 0), make([]int, 0, len(candidates))sort.Ints(candidates)   // 排序,为剪枝做准备dfs(candidates, 0, target)return res
}func dfs(candidates []int, start int, target int) {if target == 0 {   // target 不断减小,如果为0说明达到了目标值tmp := make([]int, len(path))copy(tmp, path)res = append(res, tmp)return}for i := start; i < len(candidates); i++ {if candidates[i] > target {  // 剪枝,提前返回break}// i != start 限制了这不对深度遍历到达的此值去重if i != start && candidates[i] == candidates[i-1] { // 去重continue}path = append(path, candidates[i])dfs(candidates, i+1, target - candidates[i])path = path[:len(path) - 1]}
}

3. 分割回文串

在这里插入图片描述

var (path []stringres  [][]string
)func partition(s string) [][]string {path = make([]string, 0)res = make([][]string, 0)dfs(s,0)return res
}func dfs(s string, start int) {if len(s) == start { //表明找到了一个切割方案temp := make([]string, len(path))copy(temp, path)res = append(res, temp)}for i := start; i < len(s); i++ {if isPalindrome(s[start:i+1]){//表名当前是一个回文串path = append(path, s[start:i+1])dfs(s,i+1)path = path[:len(path)-1]}}
}func isPalindrome(s string) bool {for i:=0;i<len(s)/2;i++{if s[i]!=s[len(s)-i-1]{return false}}return true
}

4. 复原IP地址

在这里插入图片描述

var (path []stringres  []string
)func restoreIpAddresses(s string) []string {path = make([]string, 0)res = make([]string, 0)dfs(s, 0, 4)return res
}func dfs(s string, start int, remain int) {if remain == 0 && start == len(s) { //表明找到了一个切割方案temp := path[0]for i := 1; i < len(path); i++ {temp = temp + "." + path[i]}res = append(res, temp)}for i := start; i < start+3 && i < len(s); i++ {if isValidNumber(s[start : i+1]) {//表名当前是一个回文串path = append(path, s[start:i+1])dfs(s, i+1, remain-1)path = path[:len(path)-1]}}
}func isValidNumber(s string) bool {//前导零判断if len(s) > 1 && s[0] == '0' {return false}//判断数字大小是否在小于255num, _ := strconv.Atoi(s)if num > 255 {return false}return true
}

5. 子集问题

在这里插入图片描述

var (path   []intres  [][]int
)
func subsets(nums []int) [][]int {res, path = make([][]int, 0), make([]int, 0, len(nums))dfs(nums, 0)return res
}
func dfs(nums []int, start int) {tmp := make([]int, len(path))copy(tmp, path)res = append(res, tmp)for i := start; i < len(nums); i++ {path = append(path, nums[i])dfs(nums, i+1)path = path[:len(path)-1]}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django-auth组件

Django-auth组件 1 表结构 我们从python manage.py migrate为我们创建的auth组件内置的表开始看 auth_user&#xff1a;用户表存储用户信息&#xff08;登录admin后台&#xff09; 里面的字段分两类&#xff1a;用户基本信息&#xff08;用户名&#xff0c;邮箱&#xff0c;密…

华为OD机试【找出通过车辆最多颜色】(java)(100分)

1、题目描述 在一个狭小的路口&#xff0c;每秒只能通过一辆车&#xff0c;假设车辆的颜色只有 3 种&#xff0c;找出 N 秒内经过的最多颜色的车辆数量。 三种颜色编号为0 &#xff0c;1 &#xff0c;2。 2、输入描述 第一行输入的是通过的车辆颜色信息[0,1,1,2] &#xff0…

嵌入式0基础开始学习 ⅠC语言(4)循环结构

0.问题引入 求0~100数据之和&#xff1a; int sum 0; sum 1234....100; 废手&#xff0c;那么有没有一种好的方法取操作呢&#xff1f; int sum 0; int i 1; sum sum i; // sum 01; …

GB28181协议中常用SDP信息的含义

u字段&#xff1a;u行应填写视音频文件的URI。该URI取值有两种方式&#xff1a;简捷方式和普通方式。简捷方式直接采用产生该历史媒体的媒体源&#xff08;如某个摄像头&#xff09;的设备ID&#xff08;应符合6.1.2的规定&#xff09;以及相关参数&#xff08;如回放类型、下载…

Three.js——二维平面、二维圆、自定义二维图形、立方体、球体、圆柱体、圆环、扭结、多面体、文字

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

在Mac电脑下怎么部署QAnything?

在Mac电脑下部署QAnything&#xff0c;可以选择使用纯Python环境进行部署&#xff0c;这种方式不依赖GPU&#xff0c;适合在Mac等笔记本电脑上运行。以下是基于QAnything的纯Python环境安装教程的步骤[18]&#xff1a; 安装要求 Python 3.10&#xff08;建议使用Anaconda3来管…

RabbitMQ-默认读、写方式介绍

1、RabbitMQ简介 rabbitmq是一个开源的消息中间件&#xff0c;主要有以下用途&#xff0c;分别是&#xff1a; 应用解耦&#xff1a;通过使用RabbitMQ&#xff0c;不同的应用程序之间可以通过消息进行通信&#xff0c;从而降低应用程序之间的直接依赖性&#xff0c;提高系统的…

功率电感的设计步骤

文章目录 1&#xff1a;高导磁气隙&#xff08;铁氧体&#xff09;1.1设计原理1.2 设计步骤 2 铁粉芯2.1&#xff1a;设计原理2.2&#xff1a;设计步骤 TI电感设计 学习视频原链接 截图 1 截图1 截图1 截图 2 截图2 截图2 1&#xff1a;高导磁气隙&#xff08;铁氧体&#…

基于机器学习判断面部微表情发现哪些人更容易诊有帕金森病

1. 概述 帕金森病&#xff08;Parkinson’s disease&#xff0c;PD&#xff09;是一种慢性、进展性的神经退行性疾病&#xff0c;主要影响运动系统。该病症以大脑中黑质致密部多巴胺能神经元的逐渐丧失为特征&#xff0c;导致多巴胺&#xff08;一种重要的神经递质&#xff09…

【Qt】深入探索Qt窗口与对话框:从创建到管理:QDockWidget(浮动窗口)、QDialog(对话框)

文章目录 前言&#xff1a;1. 浮动窗口2. 对话框介绍2.1. 示例&#xff1a;主窗口中&#xff0c;通过点击按钮&#xff0c;弹出一个新的对话框。2.2. 创建自定义对话框2.2.1. 纯代码的方式2.2.2. 图形化界面的方式 3. 模态对话框 和 非模态对话框4. Qt 内置对话框4.1. 消息对话…

Nginx R31 doc-12-NGINX SSL Termination 安全加密

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat nginx 系列 从零手…

Git Submodules:深入理解与应用

在大型项目或跨多个独立项目的开发中&#xff0c;代码管理往往变得复杂。Git Submodules 是 Git 提供的一个强大功能&#xff0c;允许你在一个 Git 仓库&#xff08;称为父仓库&#xff09;中嵌套另一个 Git 仓库&#xff08;称为子模块仓库&#xff09;。本文将详细介绍 Git S…

Linux/Windows下如何同时运行服务端和客户端

假设服务端和客户端程序分别为server.c和client.c注意顺序&#xff01; 先运行服务端&#xff0c;后运行客户端先结束客户端&#xff0c;后结束客户端 编译 gcc -o server server.cgcc -o server client.c运行 # 先运行服务器 ./server# 再运行客户端 ./client./表示当前目录…

Hybrid Block Storage for Efficient Cloud Volume Service——论文泛读

TOS 2023 Paper 论文阅读笔记整理 问题 传统桌面和服务器应用程序向云的迁移给底层云存储带来了高性能、高可靠性和低成本的挑战。由于这些传统应用程序的I/O模式和一致性要求&#xff0c;与采用特定编程模型和范式&#xff08;如MapReduce[22]和RDD[52]&#xff09;的云原生…

香橙派AIpro(OrangePi AIPro)开发板初测评

开发板简介 最近&#xff0c;我拿到手一款Orange Pi AI Pro 开发板&#xff0c;它是香橙派联合华为精心打造的高性能AI 开发板&#xff0c;最早发布于2023年12月&#xff0c;其搭载了昇腾AI 处理器&#xff0c;可提供8TOPS INT8 的计算能力&#xff0c;内存提供了8GB 和16GB两…

基于jeecgboot-vue3的Flowable新建流程定义(一)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、vue3版本因为流程分类是动态的&#xff0c;不再固定了&#xff0c;所以新建的时候需要选择建立哪种流程类型的流程 代码如下&#xff1a; <!-- 选择模型的流程类型对话框 -->&…

算法提高之一个简单的整数问题2

算法提高之一个简单的整数问题2 核心思想&#xff1a;线段树 懒标记&#xff1a;add存每个子节点需要加的数pushdown&#xff1a;将懒标记向下存 同时清除本行懒标记 #include <iostream>#include <cstring>#include <algorithm>using namespace std;type…

数据结构(六)图

2024年5月26日一稿(王道P220) 6.1 图的基本概念 6.1.1 图的定义 6.2 图的存储及基本操作 6.2.1邻接矩阵法 6.2.2 邻接表

python web自动化(分布式测试Grid)

Grid介绍 Selenium Grid 是 Selenium 提供的⼀个⼯具&#xff0c;⽤于⽀持在多台计算机上并⾏运⾏测试。 它允许将测试分发到不同的机器和浏览器组合上&#xff0c;同时收集结果。 1.并⾏执⾏测试⽤例&#xff1a;在不同的机器上并⾏执⾏测试⽤例&#xff0c;从⽽加速整个测试过…

Vulhub——adminer

文章目录 一、CVE-2021-21311&#xff08;SSRF&#xff09;二、CVE-2021-43008&#xff08;远程文件读取&#xff09; 一、CVE-2021-21311&#xff08;SSRF&#xff09; Adminer是一个PHP编写的开源数据库管理工具&#xff0c;支持MySQL、MariaDB、PostgreSQL、SQLite、MS SQL…