LeetCode #155 Min Stack - 刷題之旅
1 題目描述
這題的重點在於要實現一個可以取得最小值的 stack,並且要求時間複雜度為 O(1)。解題思路的重點是,你要怎麼確保在 push() 的時候,更新最小值,並且在 pop() 的時候,如果 pop() 出當前最小值時,也要更新最小值。
2 解法
2.1 我的解法
有沒有發現重點,當 pop() 和 push() 的時候,最小值也會有所更新,在 pop() 的時候,最小的值被剔除時,我們希望取得第二小,因此我們會需要一個 min_stack 來記錄當前最小值,如果遇到當前更小的,就 push() 進去 min_stack 裡面。這樣儘管最小的被 pop() 出去,我們仍然可以取得第二小的值。
大概是這種感覺:
每當 push 新的值進去時,都要與 min_stack[-1] 最小值比較是否更小,若更小,也要 push 進去 min_stack 裡面。
每當 pop 出去時,也要檢查 pop 出去的值是否是當前的最小值,若是,也要把當前的 min_stack[-1] pop 出去
其他的功能就跟 stack 一樣,在 python 可以使用 list 來實現 s ...
LeetCode #20 Valid Parentheses - 刷題之旅
1 題目描述
這是一個括號匹配的問題,給一個只包含(, ), {, }, [, ]的字符串,目的是要檢查一個字串是否是有效的括號組合。
2 解法
我的想法很簡單:
先建立一個 dictionary,把所有的括號對應關係記錄下來。 key 是 (, {, [,value 是說明 key 的方向(open or close)與屬性(大, 中, 小括號)。
開始遍歷字串,如果是open,就把它放進 stack 裡面,如果是close,就檢查 stack 最上面的元素是否是對應的開括號,如果是就 pop 掉,不是就返回 False。
大概是這種感覺:
123456789101112131415161718192021222324252627class Solution: def isValid(self, s: str) -> bool: str_dic = { "{": ["open", "Big"], & ...
LeetCode #71 Simplify Path - 刷題之旅
1 題目描述
這個題目的目標是在把一個很複雜的路徑簡化成為一個簡單的路徑,例如:
input: /a/./b/../../c/
output: /c
從上面的例子來說,/a/b 進去後,往上一層,再往上一層,回到/,最後進到 /c,但直接寫成 /c 不就好了嗎?太蠢了,請簡化他!這就是題目的用意。
2 解法
從題目的思路來看,你會發現當遇到 /.. 的時候,就需要往上一層,其實就是把目前 stack 的最上面的目錄 pop 出來,當遇到正常的目錄而不是/. 或是 /.. 就可以放入 stack 裡面。從下面的圖片來看,以 /.../a/../b/c/../d/./ 為例子,我們可以看到 stack 的變化。(注意 /... 是一個目錄,因為他不是 /. 或是 /..)
從下圖來看,只要是正常檔案名稱,就放入 stack 裡面
當遇到 .. 的時候,就 pop 出來,當遇到 . 的時候,就不做任何事情,繼續往下走。
最後,把 stack 裡面的元素,用 / 串接起來,就是答案。
12345678910111213141516171819202122232425 ...
LeetCode 課前預習 - 掌握 Stack 和 Queue 大全
Stack
Stack是一種線性資料結構,遵循後進先出(LIFO)的原則。
LIFO 現實中的例子可以想像一落堆疊起來的盤子,我們需要從最上面開始拿;又或者像一台塞滿人的電梯,最後進的最靠門的人必須要先出去,後面的人才能出去。
基本操作
Push: 將元素添加到Stack的頂部。
Pop: 從Stack的頂部移除元素。
Peek/Top: 獲取Stack頂部的元素但不移除它。
1234567891011121314151617181920212223242526272829303132public static class Stack { private static class Node { private int data; private Node next; private Node(int data) { this.data = data; } } private Node top; // remove from the t ...
LeetCode #128 Longest Consecutive Sequence - 刷題之旅
1 題目描述
給一個數組,求連續的數字最多有多少個,這邊特特書挑站是 時間複雜度要求是 O(n)。
2 解法
2.1 我的解法
一開始想說把 nums 放進去 Set 裡面,他是會有一個順序的,但並不會從小排到大,所以後來才硬是把他排序過後再比較。
使用 set 的好處是可以把重複的數字過濾掉,這樣就不用擔心重複的數字會影響到我們的計算。
大概是這樣的感覺:
1234567891011121314class Solution: def longestConsecutive(self, nums: List[int]) -> int: nums_sets: Set[int] = set(nums) # 不重複的數字集合 當作字典查找 sorted_nums = sorted(nums_sets) # 排序後並filter掉重複的 按照順序 pop max_len = 0 # 最大len cur_len = 1 # 目前len while nums_sets: # ...
無標題
參考資料
https://medium.com/@phoebehuang.pcs04g/超級簡單-使用bert來建一個文本分類器-697e301818b5
LeetCode #49 Group Anagrams - 刷題之旅
1 題目描述
給定多個字串,然後把它們分類。只要字串所包含的字元完全一樣就算一類,不考慮順序。
2 解法
2.1 我的解法
因為不考慮順序,只要字串的字元完全一樣就算一類,這讓我最先想到 Set 這個資料結構。我們可以把字串轉成 Set ,想辦法讓 Set 變成 dict 的 key ,然後把相同 key 的字串放在一起。最後再把這些字串放在一個 List 中,這樣就可以得到答案了。但是 Set 是不可 hash 的,所以我們可以先把 Set 裡面的每個元素進行 hash 並相加,這也可以成功的讓。
1234567891011121314151617class Solution(object): def groupAnagrams(self, strs): """ :type strs: List[str] :rtype: List[List[str]] """ ans_dic = {} ans = [] ...
NBME - 使用 DeBERTa 模型分析病人病例
這篇文章不會談論怎麼寫程式,而是著重在說明如何為 DeBERTa 模型設計 Input 和 Ouput 以及如何評估模型的表現。
說明
題目來源:https://www.kaggle.com/c/nbme-score-clinical-patient-notes
當你去看醫生時,醫生如何解讀你的症狀會決定診斷的準確性。醫生在獲得執照之前,已經有很多撰寫病人記錄的實踐經驗,這些記錄文檔包含病人的病史、體檢結果、可能的診斷和後續護理。學習和評估撰寫病人記錄的技能需要其他醫生的反饋,這是一個耗時的過程,可以通過機器學習來改進。
直到最近,Step 2 Clinical Skills(臨床技能)考試是美國醫學執照考試(USMLE)的一個組成部分。考試要求考生與標準化病人(被訓練來扮演特定臨床病例的人)互動,並撰寫病人記錄。訓練有素的醫師評分員會根據每個病例的重要概念(稱為特徵)用量表來評分病人記錄。病人記錄中包含的這些特徵越多,得分就越高(除了其他影響考試最終得分的因素)。簡單來說,就是考生要從病例中找出可能可以作為生病的特徵。
然而,讓醫生評分病人記錄考試需要大量時間和人力、財力資源。 ...
LeetCode #169 Majority Element - 刷題之旅
1 題目描述
給一個數組,存在一個數字超過半數,找出這個數。
這題有個特殊要求,就是要線性的時間複雜度,空間複雜度是O(1)。
因此難度會在空間複雜度如何滿足1的情況下,找出最佳解法。
2 解法
2.2 我的解法
一開始我沒看到有空間複雜度的限制,所以就很直接的使用了HashTable,把每個數字出現的次數記錄下來,最後找出最大的那個。
123456789101112131415161718class Solution(object): def majorityElement(self, nums): """ :type nums: List[int] :rtype: int """ num_dic = {} threshold = len(nums) / 2 # 計算每個數字出現的次數 for i in range(len(nums)): if num_dic.ge ...
LeetCode #12 Integer to Roman - 刷題之旅
題目來源:https://leetcode.com/problems/roman-to-integer/description/
1 題目描述
把數字轉換成羅馬數字,正常情況就是把每個字母相加,並且大字母在前,小字母在後,上邊也介紹了像 4 和 9 那些特殊情況。
2 解法
2.1 我的作法(無HashTable)
簡單粗暴些,把所有可能都列舉出來,包含1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1,然後一個一個去減,直到 num 為 0 為止。
大概是這種感覺:
123456789101112131415161718192021222324252627282930class Solution(object): def intToRoman(self, num): """ :type num: int :rtype: str """ arr = [(1000, 'M' ...