每日演算法 朋友圈 島嶼數量 合法二叉樹 後繼者

2021-10-06 08:37:59 字數 2923 閱讀 1845

班上有 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...