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

news2024/9/23 9:30:01

1. 组合总和

在这里插入图片描述

var (
	path []int
	res  [][]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 [][]int
    path  []int
    used  []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] = true
        dfs(candidates, i+1, target - candidates[i])
        used[i] = false
        path = path[:len(path) - 1]
    }
}

2.2 不使用used数组

var (
    res [][]int
    path  []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 []string
	res  [][]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 []string
	res  []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
	}
	//判断数字大小是否在小于255
	num, _ := strconv.Atoi(s)
	if num > 255 {
		return false
	}
	return true
}

5. 子集问题

在这里插入图片描述

var (
    path   []int
    res  [][]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.coloradmin.cn/o/1698608.html

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

相关文章

1、Introduction to Python【Python简介】

主要目的是回顾一下主要的Python基础知识&#xff0c;当作复习。 1、使用Type查看变量属性 a 10 print(type(a)) 2、向列表中加入元素 fam [lisa, 1.74] fam [emma, 1.79]# fam [lisa, 1.74, emma, 1.79] 3、删除列表中某个元素 del(fam[index]) 4、列表具有唯一性 …

ASP.NET MVC 快速入门(图文版)

今年是2024年了&#xff0c;没有多少人在ASP.NET 去做开发&#xff0c;都使用ABP框架 &#xff0c;不过我们仍然需要了解ASP.NET MVC 的一个开发流程 MVC概述 MVC是当前比较流行的WEB程序开发模式之一&#xff0c;ASP.NET MVC是.Net对MVC的一种实现。MVC&#xff08;Model View…

CobaltStrike渗透框架进阶之扩展脚本和MSF联动

CobaltStrike扩展脚本 扩展是Cobaltstrike一个极为重要的模块&#xff0c;它有效地丰盈了cobaltstrike的功能 选择菜单栏的CobaltStrike–>脚本管理器&#xff0c;点击load&#xff0c;然后选择cna扩展文件即可&#xff0c;旁边的unload为去除该扩展&#xff0c;&#xff…

【iOS开发】—— KVC

【iOS开发】—— KVC 一. KVC的定义key和keyPath的区别用法&#xff1a; 批量复制操作字典模型相互转化KVC的其他方法 KVC原理赋值原理取值原理 一. KVC的定义 KVC&#xff08;Key-value coding&#xff09;键值编码&#xff0c;就是指iOS的开发中&#xff0c;可以允许开发者通…

3D牙科网格分割使用基于语义的特征学习与图变换器

文章目录 3D Dental Mesh Segmentation Using Semantics-Based Feature Learning with Graph-Transformer摘要方法实验结果 3D Dental Mesh Segmentation Using Semantics-Based Feature Learning with Graph-Transformer 摘要 本文提出了一种新颖的基于语义的牙科网格分割方…

小程序怎么改名

经常有商家想要对自己的小程序进行重命名&#xff0c;改名可能是为了更好地与品牌形象以及业务相匹配&#xff0c;也可能是为了更好地吸引用户。那么如何才能更名呢&#xff1f; 一、准备几个新名字。 在决定改名之前&#xff0c;首先要确定几个新的小程序名字。为什么要准备…

CCF20231201——仓库规划

CCF20231201——仓库规划 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,m,a[1001][11],b[1001]{0};cin>>n>>m;for(int i1;i<n;i){for(int j1;j<m;j)cin>>a[i][j];}for(int i1;i<n;i){bool foundfals…

Excel必知必会

文章目录 基础概念数据格式选择区域内指定格式数据多行筛选数据转换数据格式固定首行和首列在滚动时一直显示指定列数据符合预期批量填充公式 函数VLOOKUP函数 基础概念 数据格式 文本&#xff0c;数值&#xff08;默认值0&#xff09;&#xff0c;&#xff08;逻辑值&#x…

ciscn2024(上传一下,有侵权什么的问题的话联系删除)

Web Simple_php 这个Simple_php一点儿也不Simple (⋟﹏⋞) 源码放这儿了&#xff1a; <?phpini_set(open_basedir, /var/www/html/); error_reporting(0);if(isset($_POST[cmd])){$cmd escapeshellcmd($_POST[cmd]); if (!preg_match(/ls|dir|nl|nc|cat|tail|more|flag…

部署ELK日志分析系统——超详细

ELK日志分析系统 文章目录 ELK日志分析系统资源列表基础环境一、环境准备二、部署Elasticsearch软件2.1、安装Elasticsearch软件2.2、加载系统服务2.3、更改Elasticsearch主配置文件2.4、创建数据存放路径并授权2.5、启动Elasticsearch2.6、查看节点信息 三、安装Elasticsearch…

如何使用GPT-4o?

GPT-4o的时代已经到来&#xff01;昨天分享群有小伙伴询问怎么使用GPT-4o&#xff1f; 在接下来的几周&#xff0c;OpenAI将陆续向所有用户开放GPT-4o的访问权限。无论是ChatGPT Free、Plus还是Team的用户&#xff0c;都能享受到GPT-4o带来的创新体验&#xff08;企业版也已经…

Go语言之GORM框架(二) ——GORM的单表操作

前言 在上一篇文章中&#xff0c;我们对Gorm进行了介绍&#xff0c;而在这一篇文章中我们主要介绍GORM的单表查询与Hook函数,在进行今天的内容之前我们先事先说明一下&#xff0c;下面我们对单表进行操作的表结构如下&#xff1a; type Student struct {ID uint gorm:&qu…

贪心-AcWing 1522. 排成最小的数字-XMUOJ石板序列

题目 思路 getline() 是 C 标准库中的一个函数&#xff0c;用于从输入流中读取一行文本&#xff0c;并将其存储为字符串。它可以从标准输入、文件流、字符串流等不同类型的输入流中读取数据。C中istringstream、ostringstream、stringstream详细介绍和使用_c istringstream-CS…

智能合约语言(eDSL)—— 并行化方案 2

这个并行算法最初其实是在aptos上实现的&#xff0c;aptos上使用的是move虚拟机&#xff0c;后来我把它移植到我们链上了&#xff0c;但是wasm虚拟机。还是费了不少事情。 目前evm并行也比较火&#xff0c;像monad&#xff0c;sei等。经过调研发现&#xff0c;其实evm的并行&am…

代码随想录|Day42|动态规划 part07|● 70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数

70. 爬楼梯 &#xff08;进阶&#xff09; 322. 零钱兑换 class Solution: def climbStairs(self, n: int) -> int: if n < 1: return n dp [0] * (n 1) dp[0] 0 dp[1] 1 dp[2] 2 for i in range(3, n 1): dp[i] dp[i - 1] dp[i - 2] return dp[n] 279.完全平方数…

spring状态机实战

一、什么是状态机 状态机是有限状态自动机的简称&#xff0c;是现实事物运行规则抽象而成的一个数学模型&#xff0c;是一种概念性机器&#xff0c;它能采取某种操作来响应一个外部事件。这种操作不仅能取决于接收到的事件&#xff0c;还能取决于各个事件的相对发生顺序。状态…

Mybase长久破解

1、软件下载好之后&#xff0c;找到文件mybase8.ini文件 2、使用记事本打开&#xff0c;通过 Ctrl F 输入快速找到属性设置FirstUseOn.UserLic.App&#xff0c;将等号后面的数值删掉保存即可 3、使用防护中心–>自定义防护&#xff08;记得开启&#xff09; 4、添加规则…

深入JVM元空间以及弹性伸缩机制

个人博客 深入JVM元空间以及弹性伸缩机制 | iwts’s blog JVM内存模型中元空间所在位置 即在JVM运行时的内存模型。总体上有这样的图&#xff1a; 元空间 上面的图其实有点不太准。方法区本质上只是JVM的一个标准&#xff0c;不同JVM在不同版本下都可能有不同的实现&#x…

Java进阶学习笔记28——StringJoiner

Java中&#xff0c;有没有即能高效&#xff0c;又能实现更方便的拼接呢&#xff1f; StringJoiner&#xff1a; JDK8才开始的&#xff0c;跟StringBuilder一样&#xff0c;也是用来操作字符串的&#xff0c;也可以看成是一个容器&#xff0c;创建之后里面的内容是可变的。 好…