⑴ leetcode演算法
*最近在做一些 leetcode 的演算法題,我會將自己做過的演算法題記錄下來以供大家參考,如果查找不方便請看 油猴插件實現網站左側目錄生成。
給定一個排序數組,你需要在 原地 刪除重復出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。
不要使用額外的數組空間,你必須在 原地修改輸入數組 並在使用 O(1) 額外空間的條件下完成。
示例:
解答:
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。
設計一個演算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易(多次買賣一支股票)。
注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
示例:
提示:
解答:
給定一個數組,將數組中的元素向右移動 k 個位置,其中 k 是非負數。
示例:
說明:
解答:
給定一個整數數組,判斷是否存在重復元素。
如果任意一值在數組中出現至少兩次,函數返回 true 。如果數組中每個元素都不相同,則返回 false 。
示例:
解答:
給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的演算法應該具有線性時間復雜度。 你可以不使用額外空間來實現嗎?
示例:
解答:
給定兩個數組,編寫一個函數來計算它們的交集。
示例:
說明:
進階:
解答:
給定一個由整數組成的非空數組所表示的非負整數,在該數的基礎上加一。
最高位數字存放在數組的首位, 數組中每個元素只存儲單個數字。
你可以假設除了整數 0 之外,這個整數不會以零開頭。
示例:
解答:
給定一個數組 nums ,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。
示例:
說明:
給定一個整數數組 nums 和一個目標值 target ,請你在該數組中找出和為目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。
示例:
解答:
判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。
數獨部分空格內已填入了數字,空白格用 '.' 表示。
示例:
說明:
解答:
給定一個 *n *× *n* 的二維矩陣表示一個圖像。
將圖像順時針旋轉 90 度。
說明:
你必須在 原地 旋轉圖像,這意味著你需要直接修改輸入的二維矩陣。 請不要 使用另一個矩陣來旋轉圖像。
示例:
解答:
編寫一個函數,其作用是將輸入的字元串反轉過來。輸入字元串以字元數組 char[] 的形式給出。
不要給另外的數組分配額外的空間,你必須 原地修改輸入數組 、使用 O(1) 的額外空間解決這一問題。
你可以假設數組中的所有字元都是 ASCII 碼表中的可列印字元。
示例:
解答:
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
示例:
注意:
假設我們的環境只能存儲得下 32 位的有符號整數,則其數值范圍為 [−231, 231 − 1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0。
解答:
給定一個字元串,找到它的第一個不重復的字元,並返回它的索引。如果不存在,則返回 -1。
示例:
解答:
給定兩個字元串 s 和 t ,編寫一個函數來判斷 t 是否是 s 的字母異位詞。
長度一樣,包含的字母都一樣,每個字元出現的頻率也一樣,只是順序不同而已,這就屬於異位詞,
示例:
說明:
你可以假設字元串只包含小寫字母。
進階:
如果輸入字元串包含 unicode 字元怎麼辦?你能否調整你的解法來應對這種情況?
解答:
給定一個字元串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。
說明 :本題中,我們將空字元串定義為有效的迴文串。
示例:
解答:
請你來實現一個 atoi 函數,使其能將字元串轉換成整數。
首先,該函數會根據需要丟棄無用的開頭空格字元,直到尋找到第一個非空格的字元為止。接下來的轉化規則如下:
注意 :假如該字元串中的第一個非空格字元不是一個有效整數字元、字元串為空或字元串僅包含空白字元時,則你的函數不需要進行轉換,即無法進行有效轉換。
在任何情況下,若函數不能進行有效的轉換時,請返回 0 。
提示 :
示例:
解答:
實現 strStr() 函數。
給定一個 haystack 字元串和一個 needle 字元串,在 haystack 字元串中找出 needle 字元串出現的第一個位置 (從0開始) 。如果不存在,則返回 -1 。
示例:
說明:
當 needle 是空字元串時,我們應當返回什麼值呢?這是一個在面試中很好的問題。
對於本題而言,當 needle 是空字元串時我們應當返回 0 。這與C語言的 strstr() 以及 Java的 indexOf() 定義相符
解答:
「外觀數列」是一個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。前五項如下:
1 被讀作 "one 1" ("一個一") , 即 11 。
11 被讀作 "two 1s" ("兩個一") , 即 21 。
21 被讀作 "one 2", "one 1" ("一個二" , "一個一") , 即 1211 。
給定一個正整數 n(1 ≤ n ≤ 30),輸出外觀數列的第 n 項。
注意 :整數序列中的每一項將表示為一個字元串。
示例:
解答:
編寫一個函數來查找字元串數組中的最長公共前綴。
如果不存在公共前綴,返回空字元串 "" 。
示例:
說明:
所有輸入只包含小寫字母 a-z 。
解答:
請編寫一個函數,使其可以刪除某個鏈表中給定的(非末尾)節點,你將只被給定要求被刪除的節點。
現有一個鏈表 -- head = [4,5,1,9],它可以表示為:
示例:
說明:
解答:
給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。
示例:
說明:
給定的 n 保證是有效的。
進階:
你能嘗試使用一趟掃描實現嗎?
解答:
反轉一個單鏈表。
示例:
解答:
將兩個升序鏈表合並為一個新的升序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。
示例:
解答:
請判斷一個鏈表是否為迴文鏈表。
示例:
解答:
給定一個鏈表,判斷鏈表中是否有環。
為了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1 ,則在該鏈表中沒有環。
示例:
解答:
給定一個二叉樹,找出其最大深度。
二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。
說明 : 葉子節點是指沒有子節點的節點。
示例:
給定二叉樹 [3,9,20,null,null,15,7] ,
返回它的最大深度 3 。
解答:
給定一個二叉樹,判斷其是否是一個有效的二叉搜索樹。
假設一個二叉搜索樹具有如下特徵:
示例:
解答:
給定一個二叉樹,檢查它是否是鏡像對稱的。
例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。
但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的:
解答:
給你一個二叉樹,請你返回其按 層序遍歷 得到的節點值。 (即逐層地,從左到右訪問所有節點)。
示例:
二叉樹: [3,9,20,null,null,15,7] ,
返回其層次遍歷結果:
解答:
將一個按照升序排列的有序數組,轉換為一棵高度平衡二叉搜索樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:
給定有序數組: [-10,-3,0,5,9] ,
一個可能的答案是: [0,-3,9,-10,null,5] ,它可以表示下面這個高度平衡二叉搜索樹:
解答:
給你兩個有序整數數組 nums1 和 nums2,請你將 nums2 合並到 nums1 中,使 nums1 成為一個有序數組。
說明:
示例:
解答:
你是產品經理,目前正在帶領一個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。
假設你有 n 個版本 [1, 2, ..., n] ,你想找出導致之後所有版本出錯的第一個錯誤的版本。
你可以通過調用 bool isBadVersion(version) 介面來判斷版本號 version 是否在單元測試中出錯。實現一個函數來查找第一個錯誤的版本。你應該盡量減少對調用 API 的次數。
示例:
解答:
假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?
注意 :給定 n 是一個正整數。
示例:
解答:
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。
如果你最多隻允許完成一筆交易(即買入和賣出一支股票一次),設計一個演算法來計算你所能獲取的最大利潤。
注意 :你不能在買入股票前賣出股票。
示例:
解答:
給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
示例:
解答:
你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定一個代表每個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
示例:
解答:
打亂一個沒有重復元素的數組。
示例:
解答:
設計一個支持 push , pop , top 操作,並能在常數時間內檢索到最小元素的棧。
示例:
解答:
寫一個程序,輸出從 1 到 n 數字的字元串表示。
示例:
解答:
統計所有小於非負整數 n 的質數的數量。
示例:
解答:
給定一個整數,寫一個函數來判斷它是否是 3 的冪次方。
示例:
解答:
羅馬數字包含以下七種字元: I , V , X , L , C , D 和 M 。
例如,羅馬數字 2 寫做 II ,即為兩個並列的 1 。 12 寫做 XII ,即為 X + II 。 27 寫做 XXVII , 即為 XX + V + II 。
通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 IIII ,而是 IV 。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為 IX 。這個特殊的規則只適用於以下六種情況:
示例:
解答:
編寫一個函數,輸入是一個無符號整數,返回其二進製表達式中數字位數為 『1』 的個數(也被稱為 漢明重量 )。
示例:
提示:
⑵ LeetCode題解:三數之和
給你一個包含n個整數的數組nums,判斷nums中是否存在三個元素a,b,c,使得a+b+c=0?請你找出所有和為0且不重復的三元組。
注意: 答案中不可以包含重復的三元組。
輸入: nums = [-1,0,1,2,-1,-4]
輸出: [[-1,-1,2],[-1,0,1]]
我們其實可以將這道題轉化為LeetCode兩數之和那道題,具體做法如下:
前提條件,我們需要將數組排序。
首先,外層遍歷,作為第一個數first,並且將目標數target設置為-nums[first]。
接下來,我們只需要兩個雙指針second與third,分別指向first+1與最後一個數,兩個指針隨著遍歷向中靠攏。如果nums[second]+nums[third]>target,那麼third就左移,否則,second就左移。而second是隨著內層遍歷而增加的。
因為我們事先將數組進行了排序,所以當內層循環達到second=third時依然找不到答案,那麼就跳過內層循環,直接遍歷下一個first。
復雜度分析
⑶ LeetCode - 1. 兩數之和(C語言)
給定一個整數數組和一個目標值,找出數組中和為目標值的兩個數。
你可以假設每個輸入只對應一種答案,且同樣的元素不能被重復利用。
示例:
⑷ LeetCode107題C語言報錯:Runtime Error,請大神幫助改正代碼
printf("%s",n);
要改成
printf("%c",n);
⑸ 【leetcode C語言實現】面試題 02.05-鏈表求和
給定兩個用鏈表表示的整數,每個節點包含一個數位。
這些數位是反向存放的,也就是個位排在鏈表首部。
編寫函數對這兩個整數求和,並用鏈表形式返回結果。
示例:
輸入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
輸出:2 -> 1 -> 9,即912
進階:假設這些數位是正向存放的,請再做一遍。
示例:
輸入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
輸出:9 -> 1 -> 2,即912
當兩個整數相加時,從個位開始,依次將兩個數的對應位置進行相加,將所得結果的個位數作為相加後對應位置的結果,若有進位將進位的值在更高一位進行相加。此處兩個數是以鏈表存儲,同樣的思路,依次將兩個數的對應位置進行相加,並將所得結果保存到一個鏈表中。
運行結果:
⑹ 這道題能解釋一下嗎
可以,
假設除以4的商為a余數為j,初一3的商為b余數為k
那麼可得
n=4a+j
n=3b+k
可以換算成
3n=12a+3j
4n=12b+4k
兩式相減得
n=12b+4k-12a-3j
n=12(b-a)+(4k-3j)
即能除以12餘4k-3j,所以除以6必定也餘4k-3j,如果算出來是負數或者大於6,取正值或者再除以6即可
⑺ 演算法面試通關40講 覃超 Leetcode 題目總結(未完待續)
主要是自己收集的題目,正在學習王爭老師的數據與演算法結構之美和覃超老師的演算法面試通關四十講,兩位老師推薦很經典的面試題。所以為了方便自己,在這里做一個匯總。如果對你有幫助那當然好,或者也可以看參考資料,裡面有很多優秀的Github的資源。
參考資料
演算法復雜度查看: https://www.bigocheatsheet.com/
C語言解法推薦: https://github.com/begeekmyfriend/leetcode
Java解法推薦: https://github.com/azl397985856/leetcode
數據結構與演算法之美(王爭)(有各種語言的版本): https://github.com/wangzheng0822/algo
Github 40K star leetcode: https://github.com/azl397985856/leetcode
Github 13K star Leetcode: https://github.com/haoel/leetcode
Github 63K star 用動畫的形式呈現解LeetCode題目的思路: https://github.com/MisterBooo/LeetCodeAnimation
python 解法: https://github.com/qiyuangong/leetcode
其他解法: https://github.com/qiyuangong/leetcode
06|面試題:反轉一個單鏈表&判斷鏈表是否有環
數據與演算法結構之美:
21 Merge Two Sorted Lists 【 C 】【 python 】
刪除鏈表倒數第 n 個結點 【 Leetcode 的解題 】
求鏈表的中間結點 Middle of the Linked List
20 Valid Parentheses
232 Implement Queue using Stacks 【 C 】【 My C solution 】
225 Implement Stack using Queues 【 C 】
703 Kth Largest Element in a Stream
239 Sliding Window Maximum
242 Valid Anagram
1 Two Sum 【 C 】
15 3Sum
18 4Sum
98 Validate Binary Search Tree
235 Lowest Common Ancestor of a Binary Search Tree
236 Lowest Common Ancestor of a Binary Tree
50 Pow(x, n)
169 Majority Element
122 Best Time to Buy and Sell Stock II
冒泡排序,選擇排序,插入排序,供參考:【 C 】
(未完待續,大概等我做完上面這些就可以繼續補充剩下的了吧)
⑻ [LeetCode刷題]演算法--雙指針
參考: @CyC2018
雙指針主要用於遍歷數組,兩個指針指向不同的元素,從而協同完成任務。
167.有序數組的 Two Sum(Easy)
633.兩數平方和(Easy)
680.迴文字元串(Easy)
88.歸並兩個有序數組(Easy)
141.判斷鏈表是否存在環(Easy)
524.最長子序列(Medium)
345.反轉字元串中的母音字元(Easy)
題目描述:
在有序數組中找出兩個數,使它們的和為 target。(不可以重復使用相同的元素)
思路:
使用雙指針,一個指針指向值較小的元素,一個指針指向值較大的元素。指向較小元素的指針從頭向尾遍歷,指向較大元素的指針從尾向頭遍歷。
數組中的元素最多遍歷一次,時間復雜度為 O(N)。只使用了兩個額外變數,空間復雜度為 O(1)。
題目描述:
給定一個非負整數 c ,你要判斷是否存在兩個整數 a 和 b,使得 。
思路:
題目描述:
給定一個非空字元串 s,最多刪除一個字元。判斷是否能成為迴文字元串。
(「迴文串」是一個正讀和反讀都一樣的字元串,比如「level」或者「noon」等等就是迴文串。)
思路:
題目描述:
編寫一個函數,以字元串作為輸入,反轉該字元串中的母音字母。
思路:
使用雙指針,一個指針從頭向尾遍歷,一個指針從尾到頭遍歷,當兩個指針都遍歷到母音字元時,交換這兩個母音字元。
為了快速判斷一個字元是不是母音字元,我們將全部母音字元添加到集合 HashSet 中,從而以 O(1) 的時間復雜度進行該操作。
⑼ LeetCode108題C語言報錯:Runtime Error free(): invalid pointer: 0x0000000001dea2f0,請大神幫助改正
雖然,我沒怎麼看懂你的思路。但感覺問題應該是,你申請結點的時候,沒有NULL賦值給沒有孩子的結點。如果不是NULL,驗證程序就會一直遍歷~ 僅供參考。。