電話號碼的字母組合 | Medium | LeetCode#17. Letter Combinations of a Phone Number
題目敘述 題目難度: Medium 題目敘述: 題目給定一個包含由數字 2-9 組成的連續字串 digits, 回傳所有可能的字母組合,回傳的組合不限順序。 這裡的字母可能對應到的就是題目給的電話號碼圖片,數字 1 跟 0 沒有對應的字母 解法一開始的想法提到 所有可能的組合數 這種問題就會想到 backtracking,由於題目中的電話號碼數字跟字母有對應關係,因此我的想法是,可以透過雜湊表來去保存這個mapping關係,接著再去進行組合。首先思考遞迴終止條件,遞迴終止條件就是已經窮盡給定的 digits 中的數字。 接著在每一層中,應該要去嘗試數字對應的每一種字母,要取出來放入字串變數中,而這裡還需要注意針對雜湊表的存取。取出後接著就是遞迴呼叫下一層,實現backtracking來窮盡各種組合。 我的解法1234567891011121314151617181920212223242526272829303132class Solution {public: unordered_map<string, vector<string>&...
產生括號 | Medium | LeetCode#22. Generate Parentheses
題目敘述 題目難度: Medium 題目敘述: 給定 n 組括號,請產生所有可能的閉合括號的組合 反正就是沒有 (() 或者是 )() 類似這樣的組合 解法一開始的想法這題求組合的所有可能性,所以想法上一定還是 backtracking,但今天的問題會是要怎麼樣 控制括號能夠閉合,以 backtracking 的解題架構來看,首先可以思考退回條件會是一旦每個組合中的長度到達了 2 * n 因為 會是 n 組括號,另外每一層中在選一定要先選左括號再選右括號,因此需要判斷當前右括號數量是否小於左括號,如果小於就代表一定至少有一組括號還沒閉合完畢。 我的解法12345678910111213141516171819202122class Solution {public: vector<string> parentheseList; void generateParentheseshelper(int left, int right, vector<string> &parenthese, string current, i...
組合之和問題 | Medium | LeetCode#39. Combination Sum
題目敘述 題目難度: Medium 題目敘述: 題目會給一個整數陣列叫做 candidates 和一個目標整數 target,回傳一系列candidates的unique組合,其中對於每種組合中數字的總和要等於 target,可以以任何順序回傳各種可能。 在這個問題中,每個candidates中的數字可以被選擇無限次。若至少有一個數字被選擇的次數不同,那麼兩個組合即被視為唯一的。Ex. [2,2,3] != [2,2,2,2,3]測試案例會保證在給定的輸入下,組成目標數字的唯一組合總數少於 150 個。 解法一開始的想法既然是組合問題,那就直接聯想到 Backtracking,另外由於這題與 77.Combinations 那篇 不同的是,這個沒有限制層數,因為題目也說了 candidates 中的數字可以被重複選擇無限多次,因此終止條件不會跟往常一樣是透過層數來做限制。 而可能會需要透過變數來在每次做選擇時儲存該值,並將變數值傳遞到下一層進行累加,最後在看是否與 target 相等。如果不相等就繼續選擇數字,另外與往常不同的是,由於可以重複選擇相同數字,因此進入每一層...
手動 migration 的其他方式 | PVE 系列-3
前言在 PVE 系列文章的第一篇 有示範在PVE的控制台上面進行 migration,而這裡紀錄另一種可以進行 Migration 的方式 手動 Migration可以選擇先進入節點的 shell,接著進入 /etc/pve/nodes 目錄中,可以發現底下有相同cluster的所有節點 1234root@pve:/etc/pve/nodes# ls -ltotal 0drwxr-xr-x 2 root www-data 0 Sep 10 11:06 pvedrwxr-xr-x 2 root www-data 0 Sep 10 14:21 pve2 接著進入目標節點 pve2,會發現裏頭有許多目錄,這裡跟 migration 有關的目錄會是 lxc 以及 qemu-server 這取決與你要 migrate 的是容器還是VM,如果要mirgate 容器就將 lxc 底下的設定檔移到目標節點的相同路徑底下,例如 /etc/pve/nodes/pve/lxc/。同理要移植 VM 也是,將 qemu-server 底下的設定檔移動到 /etc/pve/nodes/pve/qemu-se...
組合問題 | Medium | LeetCode#77. Combinations
題目敘述 題目難度: medium 題目敘述: 給定兩個整數 n 和 k,求 [1,n] 範圍中,任意 k 個數字的所有組合可能,要用二維vector回傳。 其實數學意義就是要求 $C^{n}_{k} 的答案$ 解法一開始的想法一開始的大方向也是 backtracking,並且思考方想跟 46.Permutations 很像,骨幹一樣是一個 for 迴圈,迴圈代表每一層中要組合的數字,會去從 [1,N] 去進行組合,而由於數字不能重複,因此我們迴圈的初始值會給定一個變數 start,並且會在每次進入下一層時,去更新傳入的 start參數。如果抵達給定的層這裡也就是題目的 N,那就會退回,而這裡為了輸出最終結果,會將陣列添加到儲存最終結果的二維陣列中。 之後如同其他 backtracking 題目一樣,會回退,將原先占用陣列的值pop 出來,以便進行其他選擇。 我的解法123456789101112131415161718192021class Solution {public: vector<vector<int>> result...
排列問題 | Medium | LeetCode#46. Permutations
題目敘述 題目難度: Medium 題目敘述: 給定一個整數陣列 nums 其中不包含重複數字,找到所有數字排列後的可能情況。 輸入: nums = [1,2,3]輸出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]輸出結果為輸入陣列中元素的各種排列結果。 解法一開始的想法Permutations 其實就是經典的 backtracking 題目,也是典型的樹狀結構,在每一層都先選擇一個數字,並且透過遞迴進入下一層,而一但到達指定層數,就可想辦法 return,退回後原先占用在陣列的數字就可以 pop 出來的。但我按照這個想法時做的時候,起初的結果是有重複數字的,也就是 [1,1,1],[1,1,2] … [3,3,3] 像是這種的,後來才進行了修正。 我的解法12345678910111213141516171819202122232425262728class Solution {public: vector<int> numList; vector<vector<int...
刷題知識整理 | Backtracking & Recursive
遞迴在解 backtracking 題目的時候,通常可以使用遞迴回來實現,那最好還是要先了解遞迴的想法。遞迴的核心想法就是 「大問題拆成多個小問題,小問題也能按照相同方式切成更小的問題」、「除了最小的問題之外,每層的解決方式都一樣」 河內塔問題(Tower of Hanoi) 河內塔問題就是經典的遞迴問題,它的問題是,有三根柱子,並有 N 個圓盤套在最左邊柱子上面(上圖 N = 4),現在我們要把它們全部移動到最右邊的柱子上,請問我們最少需要移動幾次? 每次可選一個柱子,移動最上方的圓盤,一次只能一動一個 大的圓盤不可以疊在小的上面 這裡就需要 Follow 一下遞迴的思維,靠解決多個小問題來解決大問題。 這裡的大問題就是 要怎麼移動四個圓盤到最右邊要幾個步驟? 而小問題則是 移動三個圓盤要幾步? 這邊問題本質一樣,只是問題範圍縮小而已,這裡假設我們已經知道移動兩個圓盤的答案,可以將問題想像成下面圖這樣 從左邊將上面三個圓盤移動到中間 (怎麼移動的先不管,總之目前結果就是有三個圓盤疊在中間) 將最左邊的圓盤移動到最右邊 將中間三個圓盤移動到最右邊 (...
基於 CPU 功耗來進行 PVE 虛擬機的 Live Migrations | PVE 系列-2
前言上一篇文章中我們介紹了如何在 Proxmox VE 中對虛擬機進行 Live Migrations,現在我們要加入條件來去對虛擬機進行 Migrations,由於我目前需求會是功耗,因此會需要知道在如何獲取 CPU 功耗的資訊。 獲取 CPU 功耗資訊通常可以透過幾種方式來獲取 CPU 或者是其他硬體的功耗,最簡單的方式就是透過 powerstat 來在 Linux/Unix 環境中查看 CPU 的功耗。 另外如果主機有 BMC和支援IPMI 的話,那就可以透過 ipmitool 去獲取主機的電力消耗資訊。 題外話: 其實 Proxmox VE 本身是有支援 IPMI watchdog 的,可以在 /etc/default/pve-ha-manager 裡面去取消註解,改成使用 IPMI watchdog,因為默認是使用作業系統層級的 softdog,但如果主機板沒有支援的話那就還是用默認的就好。 這邊提供幾行指令檢測你的主機有沒有支援 IPMIsudo apt-get install ipmitool檢查 BMC (Board Management Cont...
填充每個節點的右側指標 II| Medium | LeetCode#117. Populating Next Right Pointers in Each Node II
題目敘述 題目難度:Medium 題目敘述: 題目會給 Binary Tree 的節點,節點結構如下,除了 *left, *right pointer 之外,還多了一個 *next 指標,用於指向該層中右方的節點,而如果右方節點不存在,則 *next 指向 NULL 123456struct Node { int val; Node *left; Node *right; Node *next;} 上圖中的例子中,題目會依序給 Binary Tree 的節點 [1,2,3,4,5,null,7] 而輸出結果也如圖,節點 1 沒有右邊節點,所以它的 *next 指向 NULL。再來就是下一層,節點 2 的下一個是節點 3,而節點 3 沒有右邊節點,所以會是指向 NULL 123(1) -> NULL(2) -> (3) -> NULL(4) -> (5) -> (7) -> NULL 解法一開始的想法看到這個題目的第一想法就是 BFS,因為題目要求要找右邊節點,而這個操作都會在相同 level 去做,因此我在想...
實作 Proxmox VE VM 的 Live Migrations | PVE 系列-1
Proxmox VE 介紹Proxmox VE(PVE) 是一個開源的虛擬化環境,能夠同時支援基於 LXC (Linux Container) 的容器,抑或是基於Kernel 的VM,即為 KVM,也就是將 Linux Kernel 作為 Hypervisor 的虛擬化技術。 而 Proxmox 也透過介於 Host 與 Guest 的 QEMU 去處理 Guest 的硬體請求,將其轉譯給真正的硬體,搭配KVM 一起運作可帶來指令處理效能上的提升。因此可以以近乎本地環境的速度來去進行虛擬化。 實體節點設定Proxmox VE images 燒錄 這裡準備好 USB 將 Proxmox VE 的 iso image 放置其中,我選擇 Proxmox VE 7.4 ISO Installer PVE Image 官網下載處 接著就是要準備節點,並且在個別主機上調整開機順序,進到 BIOS 後將 USB 調整成第一順位,接著可以順便檢查一下BIOS 中的 KVM 有沒有 Enable,一定要先去 Enable。我的環境下,可在 BIOS 設定中的 Advanced 中找...











