491 非递减子序列
1、和求子集的共同之处在于要求每一个根节点,在这种情况下,可以不写终止条件,因为index会变得比size大,for循环就会停止,不过这题的区别在于他要求每个path至少大于2,所以在终止条件里可以写这个判断,不过我觉得也可以在for循环写,不是很简洁罢了(我放在for循环里了)
2、还有就是去重逻辑,之前那个去重逻辑适合原数组本身就是有序排列的,像这种无序排列还不让排列的,就要新建一个unorde_set来记录已经用过的元素。
3、还有就是非递减,用nums[i]和path.back()来比较 2和3在判断条件里是或的关系,只要有一个不成立,就剪枝。
46 全排列
因为数组不大,所以直接用一个向量used来记录数组中每个元素被用了没,被用了就true,在遍历之前先判断当前元素是否为true,如果是就continue,如果不是就继续遍历。在回溯之后,记得把当前元素的状态改为false;
47 全排列||
和上一题一样,不同的是要加一个if判断条件,即i>0&&nums[i-1]==nums[i]&&used[i-1]==0,含义是存在相同元素,并且第一个元素已经被用了(如果used[i-1]==1说明正在被用,那么nums[i-1]和nums[i]的关系是树枝的关系,不是树层)