算法面试通关 40 讲
覃超
Sophon Tech 创始人,前 Facebook 工程师,卡内基梅隆大学计算机硕士
78356 人已学习
新⼈⾸单¥68
课程目录
已完结/共 62 讲
第二章:理论讲解+面试题实战 (53讲)
算法面试通关 40 讲
登录|注册
留言
21
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 32 | 面试题:N皇后问题
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 合格程序员的第一步:算法与数据结构
02 | 如何事半功倍地学习算法与数据结构
03 | 如何计算算法的复杂度
04 | 如何通过LeetCode来进行算法题目练习
05 | 理论讲解:数组&链表
06 | 面试题:反转一个单链表&判断链表是否有环
07 | 理论讲解:堆栈&队列
08 | 面试题:判断括号字符串是否有效
09 | 面试题:用队列实现栈&用栈实现队列
10 | 理论讲解:优先队列
11 | 面试题:返回数据流中的第K大元素
12 | 面试题:返回滑动窗口中的最大值
13 | 理论讲解:哈希表
14 | 面试题:有效的字母异位词
15 | 面试题:两数之和
16 | 面试题:三数之和
17 | 理论讲解:树&二叉树&二叉搜索树
18 | 面试题:验证二叉搜索树
19 | 面试题:二叉树&二叉搜索树的最近公共祖先
20 | 理论讲解:二叉树遍历
21 | 理论讲解:递归&分治
22 | 面试题:Pow(x,n)
23 | 面试题:求众数
24 | 理论讲解:贪心算法
25 | 面试题:买卖股票的最佳时机
26 | 理论讲解:广度优先搜索
27 | 理论讲解:深度优先搜索
28 | 面试题:二叉树层次遍历
29 | 面试题:二叉树的最大和最小深度
30 | 面试题:生成有效括号组合
31 | 理论讲解:剪枝
32 | 面试题:N皇后问题
33 | 面试题:数独问题
34 | 理论讲解:二分查找
35 | 面试题:实现一个求解平方根的函数
36 | 理论讲解:字典树
37 | 面试题:实现一个字典树
38 | 面试题:二维网格中的单词搜索问题
39 | 理论讲解:位运算
40 | 面试题:统计位1的个数
41 | 面试题:2的幂次方问题&比特位计数问题
42 | 面试题:N皇后问题的另一种解法
43 | 理论理解:动态规划(上)
44 | 理论理解:动态规划(下)
45 | 面试题:爬楼梯
46 | 面试题:三角形的最小路径和
47 | 面试题:乘积最大子序列
48 | 面试题:股票买卖系列
49 | 面试题:最长上升子序列
50 | 面试题:零钱兑换
51 | 面试题:编辑距离
52 | 理论讲解:并查集
53 | 面试题:岛屿的个数&朋友圈(上)
54 | 面试题:岛屿的个数&朋友圈(下)
55 | 理论讲解: LRU Cache
56 | 面试题:设计和实现一个LRU Cache缓存机制
57 | 理论讲解:布隆过滤器
58 | 课程重点回顾
59 | FAQ答疑&面试中切题四件套
60 | 回到起点:斐波拉契数列
61 | 白板实战番外篇:斐波拉契数列
62 | 结课测试&最后的一些经验分享
登录 后留言

全部留言(21)

  • 最新
  • 精选
niubility
照例发一下我的java代码吧.很low但是好歹独立解决的. public class Solution { /** * 皇后可以攻击竖着的横着的,左斜线,右斜线的对手. * * @param n * @return */ public List<List<String>> solveNQueens(int n) { List<List<String>> result = new ArrayList<>(); if (n == 0) return result; Set<Integer> pie = new HashSet<>(); Set<Integer> na = new HashSet<>(); dfs(0,n,pie,na,new HashSet<>(),result,new ArrayList<>()); return result; } private void dfs(int level, int n, Set<Integer> pie, Set<Integer> na,Set<Integer> col,List<List<String>> results, List<String> tempList) { if (level > n - 1) { if (tempList.size() == n){ List<String> result = new ArrayList<>(tempList); results.add(result); } return; } boolean exists = false; // 遍历列 for (int j = 0; j < n; j++) { if (pie.contains(level + j) || na.contains(j - level) || col.contains(j)) {// 会被攻击的位置! continue; } exists = true; pie.add(level + j); na.add(j - level); col.add(j); String temp = getStr(n,j); tempList.add(temp); dfs(level + 1,n,pie,na,col,results,tempList); pie.remove(level + j); na.remove(j - level); col.remove(j); tempList.remove(temp); } if (!exists){ return; } } private String getStr(int n, int j) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < n; i++) { if (i == j){ stringBuilder.append("Q"); }else stringBuilder.append("."); } return stringBuilder.toString(); } public static void main(String[] args){ Solution solution = new Solution(); System.out.println(solution.solveNQueens(5)); } }

作者回复: 看起来不错!!

2019-03-27
2
5
Aliliin
PHP 实现: class Solution { /** * @param Integer $n * @return String[][] */ /** * @var array 结果值 */ public $res = []; /** * @var array 列值 */ public $cols = []; /** * @var array 撇值 */ public $pie = []; /** * @var array 纳值 */ public $na = []; /** * @param $n * @return array */ function solveNQueens($n) { if ($n < 1) return []; $this->queens($n, 0, []); return $this->_generate_result($n); } /** * @param $n 数量 * @param $i 坐标 * @param $curState 结果值 */ function queens($n, $i, $curState) { if ($i == $n) { array_push($this->res, $curState); return; } for ($j = 0; $j < $n; $j++) { if (in_array($j, $this->cols) || in_array($i + $j, $this->pie) || in_array($i - $j + $n, $this->na)) { continue; } array_push($this->cols, $j); array_push($this->pie, $i + $j); array_push($this->na, $i - $j + $n); $curState[$i] = $j; $this->queens($n, $i + 1, $curState); array_pop($this->cols); array_pop($this->pie); array_pop($this->na); } } /** * 拼接结果值 * @param $n 循环的次数 * @return array */ function _generate_result($n) { $ret = []; if (!empty($this->res)) { foreach ($this->res as $v) { for ($i = 0; $i < $n; $i++) { $str = ''; foreach ($v as $val) { if ($val == $i) { $str .= 'Q'; } else { $str .= '.'; } } array_push($ret, $str); } } } return array_chunk($ret, $n); } }

作者回复: Nice code !

2019-11-13
2
这得从我捡到一个鼠标垫开始说起
为了简洁而简洁的代码,可读性不好
2019-06-16
1
11
不记年
我觉得虽然网上的那个解法看上去很简洁,但实际开销比作者的更大,一是函数内定义了函数,而是,每次递归调用时都重新生成了数组,这些内部的开销对python 开讲都不小。emmm如果实际用的话我更推荐老师的
2018-11-17
5
唯夜
感觉体会递归,回溯代码就像练功一样,灵光一闪就打通了,就发现不难了,但这个只能自己体会,光靠看和听不够,得写得分析。贴个c#版本的代码,写得不算好,希望得到指点,谢谢啦 public class Solution { List<IList<string>> returnLt = new List<IList<string>>(); HashSet<int> _lie = new HashSet<int>(); HashSet<int> _pie = new HashSet<int>(); HashSet<int> _na = new HashSet<int>(); Dictionary<int, int> _state = new Dictionary<int, int>(); public IList<IList<string>> SolveNQueens(int n) { Gen(0, n); return returnLt; } void Gen(int row, int n){ if (row == n){ Append(n); return; } for (int i = 0; i < n; i++){ // check if(_lie.Contains(i) || _pie.Contains(row + i) || _na.Contains(row - i)) continue; //store state _lie.Add(i); _pie.Add(row + i); _na.Add(row - i); _state.Add(row, i); Gen(row + 1, n); //reset state _lie.Remove(i); _pie.Remove(row + i); _na.Remove(row - i); _state.Remove(row); } } void Append(int n){ if (_state.Count < n) return; List<string> lt = new List<string>(); for (int i = 0; i < n; i++){ int queenIndex = _state[i]; string str = ""; for (int j = 0; j < n; j++){ str += j == queenIndex ? "Q": "."; } lt.Add(str); } returnLt.Add(lt); } }
2019-05-30
4
Chaos👾
想问下老师cur_state在这里有什么用
2018-12-24
1
2
leeuwin
相当于滚动数组,状态压缩了
2022-04-21
1
Null
为啥分层的遍历就是dfs,难道就是因为使用递归了,不是特别理解为啥要叫DFS,我觉得归为回溯这个议题下是不是更好。
2022-02-04
1
罗耀龙@坐忘
茶艺师学编程: 超哥的板书 51. N 皇后 #1 class Solution: def solveNQueens(self, n: int) -> List[List[str]]: if n < 1: return [] self.result = [] self.cols = set(); self.pie = set(); self.na = set() self.DFS(n, 0, []) return self._generate_result(n) def DFS(self, n, row, cur_state): if row >= n: self.result.append(cur_state) return for col in range(n): if col in self.cols or row + col in self.pie or row - col in self.na: continue self.cols.add(col) self.pie.add(row + col) self.na.add(row - col) self.DFS(n, row + 1, cur_state + [col]) self.cols.remove(col) self.pie.remove(row + col) self.na.remove(row - col) def _generate_result(self, n): board = [] for res in self.result: for i in res: board.append("." * i + "Q" + "." * (n - i - 1)) return [board[i: i + n] for i in range(0, len(board), n)] #2 class Solution: def solveNQueens(self, n: int) -> List[List[str]]: def DFS(queens, xy_dif, xy_sum): p = len(queens) if p == n: result.append(queens) return None for q in range(n): if q not in queens and p-q not in xy_dif and p+q not in xy_sum: DFS(queens+[q], xy_dif+[p-q], xy_sum+[p+q]) result = [] DFS([], [], []) return [["."*i + "Q" + "."*(n-i-1) for i in sol] for sol in result]
2021-04-22
1
1
张sir
恢复现场那个操作具体作用是什么?如果去掉的话,递归到后面行,怎么匹配与前几行是否冲突,而且如果第一行随便放的话,这个4*4一定是有解的吗
2020-07-14
3
1
收起评论