2020.12.21-2020.12.27 leetcode刷題總結(拓撲排序&蓄水池抽樣&二叉搜尋樹&線段樹)

Simon¥發表於2020-12-27

拓撲排序
一.題目列表
1.課程表

題目描述:
你這個學期必須選修 numCourse 門課程,記為 0 到 numCourse-1 。
在選修某些課程之前需要一些先修課程。 例如,想要學習課程 0 ,你需要先完成課程 1 ,我們用一個匹配來表示他們:[0,1]
給定課程總量以及它們的先決條件,請你判斷是否可能完成所有課程的學習?

示例:
輸入: 2, [[1,0]]
輸出: true
解釋: 總共有 2 門課程。學習課程 1 之前,你需要完成課程 0。所以這是可能的。

題解:

2.課程表 II
題目描述:
現在你總共有 n 門課需要選,記為 0 到 n-1。
在選修某些課程之前需要一些先修課程。 例如,想要學習課程 0 ,你需要先完成課程 1 ,我們用一個匹配來表示他們: [0,1]
給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。
可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完成所有課程,返回一個空陣列。

示例:
輸入: 2, [[1,0]]
輸出: [0,1]
解釋: 總共有 2 門課程。要學習課程 1,你需要先完成課程 0。因此,正確的課程順序為 [0,1] 。

題解:

蓄水池抽樣
一.題目列表
1.隨機數索引

題目描述:
給定一個可能含有重複元素的整數陣列,要求隨機輸出給定的數字的索引。 您可以假設給定的數字一定存在於陣列中。

示例:
int[] nums = new int[] {1,2,3,3,3};
Solution solution = new Solution(nums);
// pick(3) 應該返回索引 2,3 或者 4。每個索引的返回概率應該相等。
solution.pick(3);
// pick(1) 應該返回 0。因為只有nums[0]等於1。
solution.pick(1);

題解:

2.連結串列隨機節點
題目描述:
給定一個單連結串列,隨機選擇連結串列的一個節點,並返回相應的節點值。保證每個節點被選的概率一樣。

示例:
// 初始化一個單連結串列 [1,2,3].
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
Solution solution = new Solution(head);
// getRandom()方法應隨機返回1,2,3中的一個,保證每個元素被返回的概率相等。
solution.getRandom();

題解:

二叉搜尋樹
一.題目列表
1.BiNode

題目描述:
二叉樹資料結構TreeNode可用來表示單向連結串列(其中left置空,right為下一個連結串列節點)。實現一個方法,把二叉搜尋樹轉換為單向連結串列,要求依然符合二叉搜尋樹的性質,轉換操作應是原址的,也就是在原始的二叉搜尋樹上直接修改。
返回轉換後的單向連結串列的頭節點。

示例:
輸入: [4,2,5,1,3,null,6,0]
輸出: [0,null,1,null,2,null,3,null,4,null,5,null,6]

題解:

2.將二叉搜尋樹變平衡
題目描述:
給你一棵二叉搜尋樹,請你返回一棵 平衡後 的二叉搜尋樹,新生成的樹應該與原來的樹有著相同的節點值。
如果一棵二叉搜尋樹中,每個節點的兩棵子樹高度差不超過 1 ,我們就稱這棵二叉搜尋樹是 平衡的 。

示例:
輸入:root = [1,null,2,null,3,null,4,null,null]
輸出:[2,1,3,null,null,null,4]
解釋:這不是唯一的正確答案,[3,1,4,null,2,null,null] 也是一個可行的構造方案。

題解:

**3.把二叉搜尋樹轉換為累加樹 **
題目描述:
給出二叉 搜尋 樹的根節點,該樹的節點值各不相同,請你將其轉換為累加樹(Greater Sum Tree),使每個節點 node 的新值等於原樹中大於或等於 node.val 的值之和。

示例:
輸入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
輸出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

題解:

線段樹
一.題目列表
1.區域和檢索 - 陣列可修改

題目描述:
給定一個整數陣列 nums,求出陣列從索引 i 到 j (i ≤ j) 範圍內元素的總和,包含 i, j 兩點。
update(i, val) 函式可以通過將下標為 i 的數值更新為 val,從而對數列進行修改。

示例:
Given nums = [1, 3, 5]
sumRange(0, 2) -> 9
update(1, 2)
sumRange(0, 2) -> 8

題解:

相關文章