班上有 n 名學生。其中有些人是朋友,有些則不是。他們的友誼具有是傳遞性。如果已知 a 是 b 的朋友,b 是 c 的朋友,那麼我們可以認為 a 也是 c 的朋友。所謂的朋友圈,是指所有朋友的集合。
給定乙個 n * n 的矩陣 m,表示班級中學生之間的朋友關係。如果m[i][j] = 1,表示已知第 i 個和 j 個學生互為朋友關係,否則為不知道。你必須輸出所有學生中的已知的朋友圈總數。
輸入:
[[1,1,0],
[1,1,0],
[0,0,1]]
輸出: 2
第2個學生自己在乙個朋友圈。所以返回2。
輸入:
[[1,1,0],
[1,1,1],
[0,1,1]]
輸出: 1
class solution
int visited = new int[arr.length];
int count = 0;
for(int i = 0;i < arr.length;i++)
}return count;
}public void dfs(int arr, int visited,int index)}}
}
解題思路也特別easy,就是深度優先遍歷就解決了。就是看連著的他們這乙個圈子有多少。
給你乙個由 '1'(陸地)和 '0'(水)組成的的二維網格,請你計算網格中島嶼的數量。
島嶼總是被水包圍,並且每座島嶼只能由水平方向或豎直方向上相鄰的陸地連線形成。
此外,你可以假設該網格的四條邊均被水包圍。
輸入:
11110
11010
11000
00000
輸出: 1
輸入:
11000
11000
00100
00011
輸出: 3
解釋: 每座島嶼只能由水平和/或豎直方向上相鄰的陸地連線而成。
class solution
int n = grid.length;
int m = grid[0].length;
int result = 0;
for(int i = 0;i < n;i++)}}
return result;
}public void dfs(char grid,int i,int j)
if(i + 1 <= m && grid[i + 1][j] == '1')
if(j - 1 >= 0 && grid[i][j - 1] == '1')
if(j + 1 <= n && grid[i][j + 1] == '1')
}}
這個也是找連在一塊兒的島嶼,但是與朋友圈有本質的不同,只能搜尋的時候按照上下左右來。搜尋過的值設定0
實現乙個函式,檢查一棵二叉樹是否為二叉搜尋樹。
輸入:
2/ \
1 3
輸出: true
輸入:
5/ \
1 4
/ \3 6
輸出: false
解釋: 輸入為: [5,1,4,null,null,3,6]。
根節點的值為 5 ,但是其右子節點值為 4 。
/**
* definition for a binary tree node.
* public class treenode
* }*/class solution
treenode maxleft = root.left, minright = root.right;
while (maxleft != null && maxleft.right != null)
while (minright != null && minright.left != null)
boolean ret = (maxleft == null || maxleft.val < root.val) && (minright == null || root.val < minright.val);
return ret && isvalidbst(root.left) && isvalidbst(root.right);
}}
最簡單的方法就是中序遍歷,然後看是否是公升序序列,但是那樣效率低。看到乙個大神的做法是,從根節點開始,依次判斷左子樹的最大節點比當前節點小,右子樹的最小節點比當前節點大,之後對於每乙個節點,都是這麼操作,其中有一次不滿足,就失敗!就做成功了。
設計乙個演算法,找出二叉搜尋樹中指定節點的「下乙個」節點(也即中序後繼)。
如果指定節點沒有對應的「下乙個」節點,則返回null
。
輸入: root = [2,1,3], p = 1
2 / \
1 3
輸出: 2
輸入: root = [5,3,6,2,4,null,null,1], p = 6
5/ \
3 6
/ \2 4
/
1輸出: null
class solution
inordersuccessor(root.left,p);
if(root==p)else if(flag)
inordersuccessor(root.right,p);
return aimnode;
}}
中序遍歷,當發現前乙個節點是目標節點的時候就記錄下來,設定乙個標誌,之後發現後續節點了,直接就儲存。 演算法學習 合法二叉搜尋樹
實現乙個函式,檢查一棵二叉樹是否為二叉搜尋樹。二叉搜尋樹性質 根節點的值大於左子樹所有節點的值,小於右子樹所有節點的值。一般二叉搜尋樹的遍歷分成以下幾種 前序遍歷 根結點 左子樹 右子樹 中序遍歷 左子樹 根結點 右子樹 後序遍歷 左子樹 右子樹 根結點 層次遍歷 從上到下,從左到右。結合定義我們知...
每日演算法 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。核心思路 二叉樹的前序遍歷順序是 根節點 左子樹 右子樹,每個子樹的遍歷順序同樣滿足前序遍歷順序。二叉樹的中序遍歷順序是 左子樹 根...
每日演算法 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3解法一 遞迴。definition for a binary tree node.publi...