Leetcode 216.组合总和 III

题目:216.组合总和 III

初始思路

代码

  1. var combinationSum3 = function (k, n) {
  2. let result = []
  3. let path = []
  4. const backtracking = (k, n, startIndex) => {
  5. if (path.length === k) {
  6. const sum = path.reduce((s, cur) => s + cur)
  7. if (sum === n) {
  8. result.push([...path])
  9. }
  10. return
  11. }
  12. for (let i = startIndex; i <= 9; i++) {
  13. path.push(i)
  14. backtracking(k, n, i + 1)
  15. path.pop()
  16. }
  17. }
  18. backtracking(k, n, 1)
  19. return result
  20. };
  1. var combinationSum3 = function (k, n) {
  2. let result = []
  3. let path = []
  4. const backtracking = (k, n, startIndex) => {
  5. if (path.length === k) {
  6. const sum = path.reduce((s, cur) => s + cur)
  7. if (sum === n) {
  8. result.push([...path])
  9. }
  10. return
  11. }
  12. for (let i = startIndex; i <= 9 - (k - path.length) + 1; i++) {
  13. path.push(i)
  14. backtracking(k, n, i + 1)
  15. path.pop()
  16. }
  17. }
  18. backtracking(k, n, 1)
  19. return result
  20. };

感想

  1. 跟77.组合相比,横向是确定死了,1~9的数组,在向下取数的时候多了求和的判断。
    image.png
  2. 剪枝
    image.png

Leetcode 17.电话号码的字母组合

题目:17.电话号码的字母组合

初始思路

使用map可以实现数字和字母的映射,然后就很像组合了。

代码

  1. var letterCombinations = function (digits) {
  2. const k = digits.length
  3. if (k === 0) return []
  4. // 因为是从0开始的,所以占位一个0,1也不对应任何字符
  5. const map = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
  6. // 如果只按下一个数字的话,就是对应的几个字母拆分成一个字母
  7. if (k === 1) return map[digits].split("")
  8. let result = []
  9. let path = []
  10. // index代表走到了digits的哪个数字
  11. const backtracking = (n, k, index) => {
  12. if (path.length === k) {
  13. result.push(path.join(''))
  14. return
  15. }
  16. for (const v of map[n[index]]) {
  17. path.push(v)
  18. // 下一层
  19. backtracking(n, k, index + 1)
  20. path.pop()
  21. }
  22. }
  23. backtracking(digits, k, 0)
  24. return result
  25. };

感想

  1. 首先要注意map的映射,然后取出map表的时候的操作。
    image.png