Backtracking/BFS

What does it use for?

  1. 求组合(顺序不matter)

    1. 4个位置,选2个位置,有哪些可能
      1. 每一层dfs都循环pos到maxLen位置,下一层,就从这一层选择的位置i的下一个位置i+1开始,来防止重复。用一个tempList记录沿途的选择,回归的时候,从tempList删掉最后一个再循环下一个。终止(base case)往往可以用一个counter来记录“2个位置”用完了来判断。
        1. https://leetcode.com/problems/binary-watch/#/description
    2. Combination Sum: 一串数字(给定一个Set数组),求?个数字加起来等于一个target

    3. 如果可以重复使用一个数字,那么dfs下一层就从循环变量i开始,如果不行就从i+1开始,每一层的选数条件,就是剩余的target是不是大于准备选的这个数字(target在每次进入下一层dfs的时候都会减掉这一层选定的数字,回归时不用操作,因为target是primitive)

      1. https://leetcode.com/problems/combination-sum/#/description
    4. 如果不能出现重复的组合,给定数组乱序,有重复元素。那么得先sort,然后每一层dfs从下一个位置开始就可以了。其他与“i”里面一致

      1. https://leetcode.com/problems/subsets/\#/description

      2. https://leetcode.com/problems/subsets-ii/\#/description

      3. https://leetcode.com/problems/combinations/\#/description

  2. 求排列(顺序matter)

    1. permutation题,如果size固定,只是为了换顺序,可以看成,每一层dfs,是从余下所有元素中选一个出来,如果一个又可以easily把剩下的元素给下一个位置选呢?可以把“选”的元素swap到当前pos来,再进入下一层dfs,下一层就从pos+1位置开始,回归的时候,再swap回去就是了。这种是比较costly的算法。简单的替代方法是用一个HashSet,但是如果是一串复杂的Object,用Set比较靠不住(因为Hash Function自己又不会去特别地写一个),一般就用这种swap的方法比较make sense。

      1. https://leetcode.com/problems/permutations/#/description
    2. permutation II题,原数组中有重复元素,求排列(顺序matter)。这个题设,如果用上面的做法,就会出现重复,比如【1,1,2】。 只用swap是不行的,应该在每一个pos的dfs的那一层,创一个set,确保这一层,不重复利用元素。所以还是继续用swap的方法,只是swap之前,check一下set里面是不是已经存在了,如果存在,就略过。这种方法,下一层都是是从前一层的pos+1开始循环余下的元素的,加上swap来防止。如果所有的元素都是int,也可以,每一层都循环所有元素,再开一个int数组来记录哪些已经used了,回归的时候记得把used数组还原一下就好了。还有一种防止每个pos使用重复元素的方法是,sort数组先,然后每一层循环所有元素的时候,就看num[i]==num[i-1] (i > pos的时候)的话就skip这个i就是了,因为sort过了,所有重复的元素会相邻的。

      1. https://leetcode.com/problems/permutations-ii/#/description

      2. https://leetcode.com/problems/beautiful-arrangement/#/description

results matching ""

    No results matching ""