知名互聯(lián)網(wǎng)公司校招中常見的算法題(9-10)
題目九:島嶼數(shù)量
給定一個由 '1'(陸地)和 '0'(水)組成的二維網(wǎng)格,計算島嶼的數(shù)量。一個島被水包圍,并且通過水平方向或豎直方向上相鄰的陸地連接而成。你可以假設網(wǎng)格的四個邊均被水包圍。
解決思路:
我們可以用深度優(yōu)先搜索(DFS)來解決這個問題。我們遍歷整個網(wǎng)格,如果遇到一個陸地('1'),就用 DFS 將與該陸地相鄰的陸地全部標記為已訪問。最后遍歷完整個網(wǎng)格后,島嶼的數(shù)量就是 DFS 的執(zhí)行次數(shù)。
代碼實現(xiàn):
public int numIslands(char[][] grid) {
? int m = grid.length;
? int n = grid[0].length;
? int count = 0;
? for (int i = 0; i < m; i++) {
? ? ? for (int j = 0; j < n; j++) {
? ? ? ? ? if (grid[i][j] == '1') {
? ? ? ? ? ? ? dfs(grid, i, j);
? ? ? ? ? ? ? count++;
? ? ? ? ? }
? ? ? }
? }
? return count;
}
public void dfs(char[][] grid, int i, int j) {
? int m = grid.length;
? int n = grid[0].length;
? if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] == '0') {
? ? ? return;
? }
? grid[i][j] = '0';
? dfs(grid, i + 1, j);
? dfs(grid, i - 1, j);
? dfs(grid, i, j + 1);
? dfs(grid, i, j - 1);
}
題目十:二叉樹的最近公共祖先
給定一個二叉樹,找到該樹中兩個指定節(jié)點的最近公共祖先。
解決思路:
我們可以用遞歸的方法來解決這個問題。如果當前節(jié)點是 p 或 q,那么最近公共祖先就是當前節(jié)點。否則,我們分別在左子樹和右子樹中查找 p 和 q,如果左子樹中不存在 p 或 q,那么最近公共祖先一定在右子樹中,反之亦然。
代碼實現(xiàn):
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
? if (root == null || root == p || root == q) {
? ? ? return root;
? }
? TreeNode left = lowestCommonAncestor(root.left, p, q);
? TreeNode right = lowestCommonAncestor(root.right, p, q);
? if (left != null && right != null) {
? ? ? return root;
? }
? if (left != null) {
? ? ? return left;
? }
? if (right != null) {
? ? ? return right;
? }
? return null;
}
以上是關于常見算法題的解決思路、代碼實現(xiàn)以及實際案例的詳細講解。對于互聯(lián)網(wǎng)公司的校招來說,掌握這些算法題可以幫助我們更好地應對面試。當然,還需要多多練習,才能真正掌握這些算法。同時,我們還需要了解一些常見的數(shù)據(jù)結構和算法,比如哈希表、堆排序、快速排序等等。只有全面掌握了這些知識,我們才能在面試中更加游刃有余。