思路

使用回溯
再使用二进制压缩状态
根据题目注意小时和分钟的剪枝

代码

  1. var readBinaryWatch = function(num) {
  2. const arr = [1, 2, 4, 8, 16, 32, 1, 2, 4, 8];
  3. const result = [];
  4. let hour = 0, min = 0;
  5. function dfs(number, state, index) {
  6. if (number === 0) {
  7. result.push(`${hour}:${min < 10 ? '0'+min : min}`)
  8. return
  9. }
  10. for(let i = index; i < arr.length; i++) {
  11. let cur = arr[i];
  12. if (state & (1 << i)) continue;
  13. // 小时
  14. if (i > 5) {
  15. if (hour + cur > 11) continue;
  16. hour += cur;
  17. dfs(number - 1, state | (1 << i), i)
  18. hour -= cur;
  19. } else { // 分钟
  20. if (min + cur > 59) continue;
  21. min += cur;
  22. dfs(number - 1, state | (1 << i), i)
  23. min -= cur;
  24. }
  25. }
  26. }
  27. dfs(num, 0, 0)
  28. return result;
  29. };
  1. var readBinaryWatch = function(num) {
  2. const result = [];
  3. function dfs(number, start, hour, min) {
  4. if (hour > 11 || min > 59) return;
  5. if (number === 0) {
  6. return result.push(`${hour}:${min < 10 ? '0'+min : min}`)
  7. }
  8. for(let i = start; i < 10; i++) {
  9. dfs(number - 1, i + 1, hour + (i > 5 ? 2 ** (i-6) : 0), min + (i > 5 ? 0 : 2 ** i));
  10. }
  11. }
  12. dfs(num, 0, 0, 0)
  13. return result;
  14. };
  1. /**
  2. * @param {number} num
  3. * @return {string[]}
  4. */
  5. var readBinaryWatch = function(num) {
  6. const nums = [1, 2, 4, 8, 1, 2, 4, 8, 16, 32]
  7. const res = []
  8. traceBack(num, 0, 0, 0)
  9. return res
  10. function traceBack(num, index, h, m) {
  11. if (h > 11 || m > 59) return;
  12. if (!num) {
  13. res.push(`${h}:${m > 9 ? m : '0'+m}`)
  14. return;
  15. }
  16. for(let i = index; i < nums.length; i ++) {
  17. traceBack(num-1, i+1, h+(i>3 ?0:nums[i]), m+(i>3?nums[i]:0))
  18. }
  19. }
  20. };

复杂度分析

时间复杂度 day40.[搜索].401.二进制手表 - 图1#card=math&code=O%282%5EN%29)
空间复杂度 day40.[搜索].401.二进制手表 - 图2#card=math&code=O%281%29)