排列组合问题
组合要简单一点,排列要难一点
组合是不要求顺序的,相同元素不同顺序算一个组合方式
排列是要求顺序的,相同元素不同顺序算不同的排列方式
如果要用到排列
就要用来回溯算法,回溯算法在搜索中寻找问题的解,发现不满足条件时,就回溯返回上一步,尝试别的路。
这里先跳过一维的排列组合问题,我们来思考一下二维的排列组合问题,即网格、迷宫类的问题。
在玩具蛇题目中,我们要求贪吃蛇不同样式的摆放个数。需要初始接口和后续接口做手脚,需要用一个vis数组来记录已经经过的路径。在进入dfs初始入口和dfs后续入口之前,我们需要用vis数组来对该入口记录;在从dfs初始入口和dfs后续入口出来之后,我们要在vis数组里面消除这个路径记录,方便尝试其他路径。这就和排列问题差不多,相同元素不同顺序算不同的排列方式。
在求最大岛屿面积和最大连通量的时候,完全不涉及到排列组合问题,所以不需要回溯。但是都必须在初始入口和后续入口之前做准备工作。
在组合问题中,不需要在初始接口之后再次进行回溯,因为完成了其他元素与初始元素的所有配对后,不会再回到初始元素的位置是哪个了,比如组合问题、组合综合|||,电话号码的字母组合。那为什么这几道组合问题的dfs(0)后面不进行回溯,因为dfs(0)在这些一维回溯题里面知识一个接口,在dfs函数里面,那个初始位置还会出现,for()循环的初始指针就是指向的初始元素。而二维回溯问题里面,进入dfs函数后,指针指向的都是下一个元素