算法--全排列、全子集、DFS\BFS问题

IC设计新手必看:如何正确使用去耦电容(decap)避免电源噪声? 本文深入探讨了IC设计中去耦电容(decap)的应用技巧,从核心原理到布局实现,帮助新手工程师有效抑制电源噪声。文章详细解析了MIM、MOM等电容类型的特性与选择策略,并提供了先进的布局技巧和验证方法,特别适用于28nm以下先进工艺的电路设计挑战。 阅读详情
排列组合
子集合 subset(medium)
输入一个含有不同数字的序列,输出所有可能的集合(含空集)。要求1 集合里元素有序排列;2 输出结果不含有重复集合;
举例:输入{1,2,3], 输出{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}
原题:https://leetcode.com/problems/subsets/
思路图:

Amortized  分期偿还(只是个名字而已)的思路: 
public static IList<IList<int>> Subsets(int[] nums)
        {
            IList<IList<int>> resSet = new List<IList<int>>();
            Array.Sort(nums);
            //初始化,加入空集
            resSet.Add(new List<int>());
            for (int i = 0; i < nums.Length; i++)
            {
                IList<IList<int>> tmp = new List<IList<int>>();
                foreach (var list in resSet)
                {
                    //保留原结果
                    tmp.Add(list);
                    List<int> clone = new List<int>(list);
                    //在原有结果里加入新元素
                    clone.Add(nums[i]);
                    tmp.Add(clone);
                }
                resSet = tmp;
            }
            return resSet;
        }
递归代码(DFS):

public static IList<IList<int>> SubSetRecrisive(int[] ints)
        {
            IList<IList<int>> resSet = new List<IList<int>>();
            if (ints == null || ints.Length == 0)
            {
                return resSet;
            }
            //Array.Sort(ints);//排序是为了方便有重复输入时判断重复;
            Helper(ints, 0, new List<int>(), resSet);
            return resSet;
        }
        public static void Helper(int[] s, int start, List<int> subset, IList<IList<int>> resSet)
        {
            //保留中间结果,不能直接添加resSet,因为这是传址,它每次都变化;
            IList<int> clone = new List<int>(subset);
            resSet.Add(clone);
            for (int i = start; i < s.Length; i++)
            {
                subset.Add(s[i]);//加入新元素,并递归调用下一个元素;
                Helper(s,i+1,subset,resSet);
                subset.RemoveAt(subset.Count-1);//退回,移除subset中最后一个索引位元素
            }
        }

备注:变种思路,如果输入数组有重复值怎么办?
答案
1 主函数中需要先排序,为Helper函数去重打基础;
2 如果s[i]==s[i-1],直接跳到下一步;


---------------------------------------------------------------------------------

全排列permutation( Medium)
题目内容,输入一个不含相同数字的序列,输出所有可能的排列permutation, 需要注意顺序
举例
输入{ 1,2,3 }
返回: {1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}
原题:https://leetcode.com/problems/permutations/

思路:与全子集相似,使用递归方法
区别: 必须等到所有数字均在集合里才能输出。所以需要辅助数组bool[] used=new bool[arr.Length]来记录元素使用情况
问题:为什么元素不能重复使用?为什么架构与subset不同?
自我解答,欢迎补充:使用1,2作为输入,确实能够得到答案,只能说此架构设计比较巧妙。长期来看只能靠记忆
public static IList<IList<int>> PermuteRecrusive(int[] ints)
      {
            IList<IList<int>> resSet = new List<IList<int>>();
            if (ints == null || ints.Length == 0)
            {
                return resSet;
            }
            Array.Sort(ints);
 
            PermuteHelper(ints, new List<int>(), resSet);
             return resSet;
        }
        /// <summary>
        /// 1 为什么循环中不需要pos参数? 2为什么参数不能重复使用?
        /// </summary>
        /// <param name="ints"></param>
        /// <param name="subset"></param>
        /// <param name="resSet"></param>
        /// <param name="used"></param>
        public static void PermuteHelper(int[] ints, List<int> subset, IList<IList<int>> resSet)
        {
            if (subset.Count == ints.Length)
            {
                resSet.Add(new List<int>(subset));
                return; //为什么需要这个?因为add后需要回到上一层递归;
            }
            for (int i = 0; i < ints.Length; i++)
            {
                if (subset.Contains(ints[i])) continue; //不能重复使用已有元素,为什么?
                subset.Add(ints[i]);//加入新元素,递归调用下一个元素
                PermuteHelper(ints, subset, resSet);
                subset.RemoveAt(subset.Count-1);//回退
            }
        }



海康门禁二次开发实战:用Java实现员工考勤系统的人脸权限管理 本文详细介绍了如何利用Java技术栈进行海康威视门禁系统的二次开发,实现员工考勤系统的人脸权限管理。从开发环境准备、SDK集成到设备连接、人脸数据批量处理,再到权限管理与异常处理,面解析了海康门禁对接开发的关键步骤和最佳实践,助力企业构建高效、安的智能考勤系统。 阅读详情

相关推荐

Ubuntu 22.04/24.04 安装 ROS2 完整教程(Humble / Jazzy)

最后更新:2026年2月适用系统:Ubuntu 22.04 LTS(Jammy) / Ubuntu 24.04 LTS(Noble)适用架构:x86_64 / arm64(包括树莓派)

2401_84116277的博客 5287

每日一知识:图的遍历算法(bfs+dfs),javascript实现

在计算机中,图结构也是一种非常常见的数据结构。图论也是一个非常大的话题图结构是一种与树结构有些相似的数据结构。本文介绍了图的封装以及图的遍历算法

aniudunaichiji的博客 1178

卡尔曼滤波器中的Q,R

对于系统状态的估计(滤波结果)所使用的信息来源于两个方面,一个是对系统状态演变模型的了解,包括系统转移矩阵和输入控制矩阵,输入孔质量等,另一方面来自于对系统状态的观测量。从上面公式来看,真正所要滤波得到的结果来自于公式(4)中的系统状态估计值x的某些分量,公式(4)的结果是由公式(1)所得到的状态预测值和来自观测量y计算得到的。所以,在不同算法中,R, Q的取值根据反应的不同量纲,可以有很大的变化,但它们的比值会决定了滤波值应该更多来自于系统模型演化的信息,还是来自于观察信号信息。

qq_43416206的博客 475

全排列组合子集问题DFS+回溯】

1.给出一列互不相同的整数,返回其全排列。 样例 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] //3个位置,每个位置枚举可以放1,2,3,利用st表示此数是否可用的状态。 class Solution { public: vector<vector<int>> an...

Code_U 413

一文带你弄懂dfsbfs

你问一个人听过哪些算法,那么深度优先搜索(dfs)和宽度优先搜索(bfs)那肯定在其中,很多小老弟学会dfsbfs就觉得好像懂算法了,无所不能,确实如此,学会dfsbfs暴力搜索枚举确实利用计算机超强计算大部分都能求的一份解,学会dfsbfs去暴力杯混分是一个非常不错的选择!五大经典算法的回溯算法其实也是dfs的一种应用,是不是回忆起被折磨的八皇后问题。基础的dfsbfs学习来思想很容易,写出来模板代码也不难,但很多时候需要在此基础上灵活变通就有不小难度了。

2401_83384536的博客 1335

JavaScript中的深度优先(dfs)和广度优先(bfs)

前端bfsdfs的应用,欢迎来学习交流!!

weixin_50789156的博客 954

子集实现

给定一串字符,他的子集毫无疑问就是2^n。这时一个个找规律发现,1个元素的时候,比如a,他的子集就是a和空,我们暂时不管空集。在a的基础上加一个元素比方说是b,此时他的子集就是a,b,ab,可能现在还没发现规律,没关系,再加一个比如c,此时子集变成a,b,ab,ac,bc,c,abc。 这下总该看出来了吧,要求n个元素的时候,只需知道n-1个元素的子集,然后在n-1的子集中,集合中每...

Ajeant的博客 582

DFS/BFS与回溯:全排列组合、N皇后的通用模板

DFSBFS是搜索算法的两大基石,回溯是DFS的经典应用。很多人觉得回溯很难,其实掌握三要素(选择、约束、结束),90%的回溯问题都能套模板。我并没有能力让你看完就秒杀所有搜索题,我只是想让你理解DFSBFS、回溯的本质和使用场景。掌握通用模板,全排列组合、N皇后都不是问题。从"全排列暴力超时"问题出发,剖析DFSBFS的核心区别、回溯算法的三要素与剪枝优化。通过决策树的图解演示、选择列表的动态维护、以及N皇后问题的完整推导,揭秘回溯算法的解题套路。

比较是偷走幸福的小偷 5097

算法】什么是 DFSBFS 及他们的区别

本文介绍了图/树遍历的两种算法DFS(深度优先搜索)和BFS(广度优先搜索)。DFS采用"一条路走到底"的策略,优先往深处探索,通过栈或递归实现;BFS则按层次扩展,用队列实现,适用于无权图最短路径问题。二者时间复杂度均为O(V+E),但适用场景不同:DFS适合回溯、路径搜索,BFS适合层级遍历和最短路径。文章通过伪代码、树遍历示例和对比表格阐明核心区别,并用走迷宫和洪水扩散的比喻形象说明差异。最后给出选型建议:根据问题特点(求最短路径/枚举方案)、图结构(深度/宽度)选择合适算法,并提醒DFS递归在深

No8g攻城狮的博客 289

数据结构与算法——DFS/BFS题目

一、电话号码的字母组合 此题为leetcode第17题 思路:使用深度优先搜索。在每次递归时有个变量combination,表示当前递归深度下的字母组合,如果它的长度等于digits的长度,那么说明递归到了最深,将它放入答案中。否则遍历下一个digits里的字母,将其与combination结合传入下层递归。 class Solution: def letterCombinations(self, digits: str) -> List[str]: self.phone =

贾维斯的小屋 492

C++ dfs搜索算法

例题一二三都是属与适用情景的第一类,而且可以发现,三道题都需要dfs递归后,在进行回溯,一般都是把原来做的标记清0,重新递归下一个分支,也印证了先深后广,走到底再回溯的额核心思想例题四属与网状dfs递归,主要是找连通块,找到这道题的核心,合理运用dfs,实现答案例题五是一道简单的二叉树问题,也是用到了dfs递归去实现,但是二叉树的遍历很明显不需要再进行回溯,遍历每个分支即可。

2601_95608711的博客 260

DFSBFS 的区别

DFS 深度优先搜索优先沿着一条分支一直往深处走,走到尽头再回溯,纵向优先遍历。BFS 广度优先搜索先访问当前一层所有节点,再进入下一层,一层一层横向遍历。

barker666的博客 339

C++ | DFS搜索(回溯法)学习分享

题解:将皇后对应的米字型区域设置成“禁区”,后面的皇后就不能放在“禁区”内,回溯时将禁区取消掉。需要用int数组来表示“一个位置被多少个皇后占了”,当占数为0的时候表示“禁区解除”。在后续搜索中,每次开始时更新最小时间戳(否则会认为7、4之间有环),如果走到已经走到过的点就必须停下。跑dfs求最大的环,用时间戳(dfn),将走过的地方标记一个时间戳(即第几步走到的)。坐标拆成两个一维数组的思想,其实就是表示一个点的上下左右。

lly18435759909的博客 1625

DFSBFS

NOIP2018 普及组 T1。

m0_74161592的博客 226

算法笔记】08 - 搜索

搜索是系统遍历所有可能状态的关键技术。文章详解了深度优先搜索、记忆化搜索、广度优先搜索。

2501_93928046的博客 2167

DFS+剪枝、DP(完背包)、BFS:零钱兑换

LeetCode 322. 零钱兑换 这道题是综合性特别强的一个问题,在初次写的时候没多想,立马就暴力DFS,之后加了剪枝改进,才通过; 之后看了AcWing的背包视频,发现可以套用完背包的思路; 然后来了兴趣,认真看了下评论区和题解区,发现能够使用BFS的思路,真是妙啊!遂记录一下。 一、DFS+剪枝 看到题,感觉和之前的子集全排列、电话号码的字母组合等题目相近,二话不说直接开写。 int coinChange(vector<int>& coins, int amou

To the beyond and infinity! 814

子集问题(subset)

子集问题的三种解法: 1.回溯法 回溯是经典的解法,有固定的模板,用递归实现。 class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { sort(nums.begin(), nums.end()); ...

weixin_30484247的博客 473

(使用C语言详解)求一个集合的子集leetcode编程笔记)

这个算法的关键在于理解如何使用二进制数来表示和生成子集。每个子集都可以通过改变tag的某一位来得到下一个子集。当tag的某一位被设置为1时,表示对应数组元素被包含在子集中;当该位被设置为0时,表示对应元素不被包含。通过这种方式,我们可以遍历所有可能的子集

StarPrayers.的博客 3320

Javascript常见算法详解

在JavaScript中,算法是处理数据、解决问题的重要工具。本文将详细介绍几种常见的JavaScript算法,包括排序算法、搜索算法、递归算法和图算法。每个算法都包含代码示例和详细解释。

yt94832的博客 499

leetcode-78-子集(用bfs解决)

题目描述: 给定一组不含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 要完成的函数: vector&l...

weixin_34019929的博客 178

BFS全排列

题目描述 输出自然数 11 到 nn 所有不重复的排列,即 nn 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 nn。 输出格式 组成的所有不重复的数字序列,每行一个序列。 每个数字保留 5 个宽。 import java.util.Scanner; public class Main { static int n=0; static int[] used=new int[100]; static int[] pd=new int[100]; //pd是判

weixin_45454137的博客 1271

广度优先遍历(一) 全排列

(零) 广度优先遍历、回溯减枝、本质上都是树(决策树)的遍历。 Leetcode 46.全排列 原题链接 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 分析:这道题有多种不同的算法,这里我利用bfs算法。 可以从数学上得全排列方法获得借鉴: 第一个数字选1,有多少中排列 第一个选2,有多少种排列算法可以用一颗树来描述: 决策树的遍历 分

qq_40965678的博客 1970

硬币分拣机(sw12+cad+说明书).zip机械设计毕业设计

硬币分拣机(sw12+cad+说明书).zip机械设计毕业设计

慧荣SM2263XT量产工具集合包

支持Hynix_3DV7包含NVME驱动文件包括:Nvme驱动.zipSM2263XT_(AD)_B16B17_PKGU0702A_FWT1103F0L(21.7.30).zipSM2263XT_B27A_B27B_PKGT0220A_FWT0214B0L.rarSM2263XT_B27A_B27B_PKGT0611A_FWT0609B0L.rarSM2263XT_B27A_B27B_PKGT0921A_FWT0918A0L.rarSM2263XT_Hynix_3DV6_PKGV0225_FWV0223A0.rarSM2263XT_Hynix_3DV7_PKGW0317_FWV1013A0.7zSM2263XT_MP_R0320A_B16_FW_R0222B0_RDT_R0320A.rarSM2263XT_MP_R0524A_B17_FW_R0515A0_RDT_R0510A.rarSM2263XT_MP_R0801A_B16_FW_R0802A0_RDT_R0718A.rarSM2263XT_WD_BiCS5_PKGV0407_FWU1104A3.rarSM2263XT_YMTC_JGS_PKGU1014A_FWU1006A0.rarSM2263XT_YMTC_PKGU0316A_FWU0225A0.rarSM2263XT_YMTC_PKGU0512A_FWT1202A0.rarSM2263XT_YMTC_TAS_PKGU0806A_FWU0806A.rarSM2263XT_YMTC_TAS_PKGV0217A_FWV0126A.rar

上一篇: 算法-两根指针类问题
下一篇: JS 日期格式转换
LeaderTech_NJ
博客等级 码龄19年 11粉丝 79原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值