LeetCode总结(三)回溯法

常规排列组合问题

  • 所有模板我们都把循环放到backtrace内!主函数内没有循环,也不用pasted.push_back()和pop_back(),都放到backtrace中
  • LeetCode 46  全排列
    • 给定一个数组,输出所有数字构成的全排列  
    • 典型题,作为很多其他回溯法题型的模板
  • LeetCode 78  幂集     
    • 简单,与46完全相同,但将所有pasted都放进ans中
  • LeetCode 77  组合
    • 两个整数 n 和 k,返回 1 ... 中所有可能的 k 个数的组合
    • 在主函数中从start = -1处开始遍历  
  • LeetCode 40  组合总和2  
    • 给定一个数组,输出组合的总和为target的所有组合
    • 由于数字不能重复使用,因此去重比较简单,只需要循环进入所有分支时,如果当前分支与前一个分支元素相同,则continue(i = start+1时例外)
  • LeetCode 39  组合总和
    • 与40题相比,这里的数字可以重复使用,因此循环进入所有分支时,从i = start处开始即可
  • LeetCode 47  全排列2
    • 在46题的基础上,增加了条件:数组中存在重复的数字,如何得到全排列?
    • 看起来给去重增加了困难,其实解决非常简单!只需要在循环所有分支并进入时,在进入前判断是否与上一个分支相同, continue的条件如下:
      • i != 0
      • a[i] == a[i-1]
      • visited[i-1] == false  在前面的数字必然是已经被检查过了的!如果visited[i-1]==0说明整个子分支都已经遍历过了,所以当前结点与这个结点相邻又相等,可以剪去
  • LeetCode 90  子集2
    • 与47题完全相同,跳过相邻重复且检查过了的结点    

 

使用回溯法的遍历、搜索问题

  • LeetCode 17  电话号码的字母组合
  • LeetCode 22  生成有效括号 

  上面两道题都是一个模式:backtrace(pasted, remain, ...),其中pasted是已经得到的模式,remain为还需要回溯的所有可能

  接下来考虑二维grid上的搜索/查找所有可行组合的问题,这才是回溯法的主要应用  

  • LeetCode 79   二维棋盘格上搜索匹配单词    
    • 这道题是一个存在性问题,只要搜索到一个满足条件的答案就让整个命题为真,与需要求出所有满足条件的情况不同,backtrace需要返回一个bool值,这个值是所有分支的backtrace的返回值的逻辑或
  • LeetCode 51  N皇后
posted @ 2019-08-22 15:01  LiaoQian1996  阅读(90)  评论(0)    收藏  举报