代码随想录day25 || 491 递增子序列,46 全排列, 47 全排列2

news/2024/11/16 13:54:27/文章来源:https://www.cnblogs.com/zhougongjin55/p/18352243

491 递增子序列

func findSubsequences(nums []int) [][]int {// 思路,在原数组上面找寻递增子序列,所以不能改变顺序,var path []intvar res [][]int//nums = quicksort(nums)backtracking(nums, &path, &res, -200) // 范围是【-100, 100】,传入一个不在区间的数字就不会重复return res
}func backtracking(nums []int, path *[]int, res *[][]int, last int) {if len(nums) == 0 {return}used := make(map[int]bool)for i:=0; i<len(nums); i++ {if used[nums[i]] {continue}if nums[i] < last{continue}*path = append(*path, nums[i])used[nums[i]] = trueif len(*path) > 1 {var copypath = make([]int, len(*path))copy(copypath, *path)*res = append(*res, copypath)}backtracking(nums[i+1 : ], path, res, nums[i])*path = (*path)[0 : len(*path) - 1]}return
}

image

func backtracking(nums []int, path *[]int, res *[][]int, startidx int) {if startidx == len(nums) {return}used := make(map[int]bool)for i:=startidx; i<len(nums); i++ {if used[nums[i]] {continue}// 注意不是对比相邻元素,而是对比当前元素与路径最后一个元素if  len(*path) > 0  && nums[i] < (*path)[len(*path) - 1]{continue}*path = append(*path, nums[i])used[nums[i]] = trueif len(*path) > 1 {var copypath = make([]int, len(*path))copy(copypath, *path)*res = append(*res, copypath)}backtracking(nums, path, res, i+1)*path = (*path)[0 : len(*path) - 1]}return
}

46 全排列

func permute(nums []int) [][]int {// 组合问题相比排列问题,递归时候传入的数组不是nums[i+1: ], 而是nums.Remove(nums[i])var path []intvar res [][]intbacktracking(nums, &path, &res)return res
}func backtracking(nums []int, path *[]int, res *[][]int) {if len(nums) == 0 {var copyPath = make([]int, len(*path))copy(copyPath, *path)*res = append(*res, copyPath)return}for i:=0; i<len(nums); i++{*path = append(*path, nums[i])// 新的数组要去除nums[i], 但是要包含其他的元素//在 Go 中,切片操作 nums[a:b] 是合法的,只要满足以下条件://0 <= a <= b <= len(nums)//nums[a:b] 返回从索引 a 开始到索引 b-1 结束的子切片。//var newNums = make([]int, len(nums) - 1)//copy(newNums, nums[0: i])//copy(newNums[i: ], nums[i+1: ])var newNums []intnewNums = append(newNums, nums[0 : i]...)newNums = append(newNums, nums[i+1: ]...)backtracking(newNums, path, res)*path = (*path)[ : len(*path) - 1]}return
}
// 两个易错点,newnums声明如果放到for循环外面可能出现错误,多次append导致newnums不断累加
// 第二点易错,使用copy函数注意第二个copy dst是newnums[i: ] 而不是newnums, 这样会覆盖第一个copy结果

全排列2

func permuteUnique(nums []int) [][]int {// 组合问题相比排列问题,递归时候传入的数组不是nums[i+1: ], 而是nums.Remove(nums[i])var path []intvar res [][]intbacktracking(nums, &path, &res)return res
}func backtracking(nums []int, path *[]int, res *[][]int) {if len(nums) == 0 {var copyPath = make([]int, len(*path))copy(copyPath, *path)*res = append(*res, copyPath)return}var used = make(map[int]bool)for i:=0; i<len(nums); i++{if used[nums[i]] {continue}used[nums[i]] = true*path = append(*path, nums[i])var newNums []intnewNums = append(newNums, nums[0 : i]...)newNums = append(newNums, nums[i+1: ]...)backtracking(newNums, path, res)*path = (*path)[ : len(*path) - 1]}return
}
// 相比上一题,加了一个used数组保存使用过的元素

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

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

相关文章

微客在线客服系统 -全渠道连接一切,客服源码独立部署搭建方案

功能介绍微客在线客服系统是一个高性能、全渠道的即时通讯解决方案,专为中小企业设计,以满足日益增长的客户服务需求。系统支持PC网站、H5网站、APP等多种平台,实现无缝的客户沟通体验。主要功能在线客服系统:智能回复与人工接待相结合,提供多渠道整合,确保不错过任何客户…

windows查看端口占用

一、通过端口号查看进程号【netstat】1.查看80端口的占用情况 netstat -aon | findstr "80"2.根据PID查看进程信息 tasklist | findstr "16816"3.结束进程 (1).使用PID结束nginx(nginx会自动重启) taskki11 /f /pid 16816 (2)通过进程名字结束nginx taskki…

2024-08-10 闲话

2024-08-10 闲话听到一个 talk 最后一页 slide 截了个图。尤其是这部分。之前的想法得到了印证。 谁是先锋?

祝各位马喽七夕节快乐

初看只知剧中事,再看已是剧中人

14、Oracle中的Set运算符

最近项目要用到Oracle,奈何之前没有使用过,所以在B站上面找了一个学习视频,用于记录学习过程以及自己的思考。 视频链接: 【尚硅谷】Oracle数据库全套教程,oracle从安装到实战应用 如果有侵权,请联系删除,谢谢。学习目标:描述 SET 操作符 将多个查询用 SET 操作符连接组…

15、Oracle中的高级子查询

最近项目要用到Oracle,奈何之前没有使用过,所以在B站上面找了一个学习视频,用于记录学习过程以及自己的思考。 视频链接: 【尚硅谷】Oracle数据库全套教程,oracle从安装到实战应用 如果有侵权,请联系删除,谢谢。学习目标:书写多列子查询 在 FROM 子句中使用子查询 在SQ…

DIY制作计算器——训练程序思维

自己做的计算器主要的逻辑如下:用两个集合,每个数字对应一个符号,先收集数字和符号,然后再处理乘除法,再处理加减法,最后得出计算的数字;(此方法不一定是最优方法,因为没有收集网络上的资料,是自己想出来的解决方案)按钮 “=” 的逻辑如下:var val = show.Text;var…

洛谷 CF896C Willem, Chtholly and Seniorious之珂朵莉树板子

洛谷CF896C题解传送锚点摸鱼环节 Willem, Chtholly and Seniorious 题面翻译 【题面】 请你写一种奇怪的数据结构,支持:\(1\) \(l\) \(r\) \(x\) :将\([l,r]\) 区间所有数加上\(x\) \(2\) \(l\) \(r\) \(x\) :将\([l,r]\) 区间所有数改成\(x\) \(3\) \(l\) \(r\) …

制作计算器——训练程序思维

自己做的计算器主要的逻辑如下:用两个集合,每个数字对应一个符号,先收集数字和符号,然后再处理乘除法,再处理加减法,最后得出计算的数字;(此方法不一定是最优方法,因为没有收集网络上的资料,是自己想出来的解决方案)按钮 “=” 的逻辑如下:var val = show.Text;var…

全新在线客服系统源码(pc+h5+uniapp+公众号小程序+抖音)附搭建接入教程

全新在线客服系统源码介绍 一、系统概述与优势 本系统是一款基于PHP的开源在线客服系统,支持PC端、移动端(小程序)、H5页面以及Uniapp多端接入。系统利用网络技术和人工智能技术,实现用户与客服人员的即时聊天沟通,有效提升服务质量和用户满意度。系统优势包括提高服务效率…

抖音私信客服系统 - 对接抖音私信统一接待回复 -以及私信或评论自动回复

在数字化时代,企业面临着前所未有的挑战与机遇。社交媒体的快速发展,尤其是小红书和抖音这样的平台,为企业提供了与消费者沟通和营销的新渠道。本文将探讨全渠道私信客服系统在企业转型中的重要性和独特价值。 一、小红书与抖音的崛起小红书以其精准的内容分享和消费推荐功能…

GitLab 之 Git LFS 大文件存储的配置

参考 https://cloud.tencent.com/developer/article/1010589LFS介绍 Git 大文件存储(Large File Storage,简称LFS)目的是更好地把大型二进制文件,比如音频文件、数据集、图像和视频等集成到 Git 的工作流中。我们知道,Git 存储二进制效率不高,因为它会压缩并存储二进制文…