關於Leetcode解題提公升(一)

2022-05-18 13:53:42 字數 2809 閱讀 1816

題目總結:

一.拼寫單詞

二.最長回文串

三.水壺問題

四.兩數之和

五.最小的k個數

紮實基礎,最為重要。

題目一:拼寫單詞

給你乙份『詞彙表』(字串陣列) words 和一張『字母表』(字串) chars。

假如你可以用 chars 中的『字母』(字元)拼寫出 words 中的某個『單詞』(字串),那麼我們就認為你掌握了這個單詞。

注意:每次拼寫(指拼寫詞彙表中的乙個單詞)時,chars 中的每個字母都只能用一次。

返回詞彙表 words 中你掌握的所有單詞的 長度之和。

示例 1:

輸入:words = ["cat","bt","hat","tree"], chars = "atach"

輸出:6

解釋:

可以形成字串 "cat" 和 "hat",所以答案是 3 + 3 = 6。

示例 2:

輸入:words = ["hello","world","leetcode"], chars = "welldonehoneyr"

輸出:10

解釋:可以形成字串 "hello" 和 "world",所以答案是 5 + 5 = 10。

1.1 <= words.length <= 1000

2.1 <= words[i].length, chars.length <= 100

3.所有字串中都僅包含小寫英文本母

解題思路:觀察題目,有words字串陣列和chars字元陣列,需要判斷的是chars中的內容能否組成words中的字串,並且將能夠組成的字串的長度輸出,由此可知,只需要建立兩個雜湊表,乙個儲存chars中字母出現的次數,乙個儲存當前訪問到的words中的字串,然後去一一對比鍵值,若chars中對應字母出現的次數大於words當前訪問到的字串,則能夠組成,用變數儲存長度之和即可。

class

solution

if(flag)

ans+=word.size();

}return

ans;}};

題目二:最長回文串

給定乙個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的回文串。

在構造過程中,請注意區分大小寫。比如 "aa" 不能當做乙個回文字串。

注意:假設字串的長度不會超過 1010。

示例 1:

輸入:"abccccdd"

輸出:7

解釋:我們可以構造的最長的回文串是"dccaccd", 它的長度是 7。

題目解析:一開始的思維是構建雜湊表,儲存字母出現的次數,然後根據回文串的特性,偶數次的字母可以全部使用,奇數次的字母使用偶數次(只有乙個奇數串可以全部使用),也就是說,我們只需要判斷有多少個奇數次的字母,減去出現的次數,最後長度加上1,就是我們所需要得到的答案。

class

solution

return odd_num == 0 ? s.length() : s.length() - odd_num + 1

; }

};

題目三:水壺問題

這個題目真是糾結了我很久很久,一開始是想列出所有狀態,用bfs去搜尋能夠得到的狀態來作對比,然後runtime直接暴斃,後來才知道個貝祖定力(也稱裴蜀定理),可以非常非常方便的解決水壺問題,也就是利用最大公約數去求解,

但是為了驗證該題目可以用裴蜀定理去解決,花了大量時間(還是太年輕了),驗證過程如下(字醜別在意):

技巧性的方法就是這樣,熟能生巧,理解問題要從不同角度去看。

class

solution

bool canmeasurewater(int x, int y, int

z) };

題目四:兩數之和

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。

你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。

示例:給定 nums = [2, 7, 11, 15], target = 9

因為 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

題目解析:又是一道建表題,該題兩種解法,第一肯定是毫無美觀可言的暴力搜,遍歷整個陣列,排列所有組合,輸出答案,時間複雜度最壞情況為o(n^2),對於嚴格的runtime要求,估計會立馬涼涼,所以需要一點技巧性,建立乙個雜湊表,

存下nums中所有元素的下標,然後遍歷nums陣列,在雜湊表中尋找是否存在target - nums[?],且設定條件不重複訪問即可。利用到了find函式。

class

solution ;

}return

{}; }

};

題目五:最小的k個數

輸入整數陣列 arr ,找出其中最小的 k 個數。例如,輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。

示例 1:

輸入:arr = [3,2,1], k = 2

輸出:[1,2] 或者 [2,1]

示例 2:

輸入:arr = [0,1,2,1], k = 1

輸出:[0]

題目解析:該題比較簡單,偷懶直接用了優先佇列的迭代器輸出。

class

solution

return

finished_arr;}};

關於LeetCode解題提公升(二)

今天遇到一道題,不得不說,思路決定一切,分享一下我的解題心路歷程和對大佬的解題方式的解析與感想。820.單詞的壓縮編碼 給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 s 與乙個索引列表 a。例如,如果這個列表是 time me bell 我們就可以將其表示為 s time bell 和 ind...

leetcode 解題 加一

給定乙個由整數組成的非空陣列所表示的非負整數,在該數的基礎上加一。最高位數字存放在陣列的首位,陣列中每個元素只儲存乙個數字。你可以假設除了整數 0 之外,這個整數不會以零開頭。示例 1 輸入 1,2,3 輸出 1,2,4 解釋 輸入陣列表示數字 123。示例 2 輸入 4,3,2,1 輸出 4,3,...

Leetcode解題思路

所有簡單題的解題思路。question count the number of prime numbers less than a non negative number,n example input 10output 4explanation there are 4 prime numbers ...