玩轉演算法面試LeetCode演算法練習——基礎算法系列
目錄
75. 分類顏色
給定一個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
注意:
不能使用程式碼庫中的排序函式來解決這道題。
示例:
輸入: [2,0,2,1,1,0]
輸出: [0,0,1,1,2,2]
進階:
- 一個直觀的解決方案是使用計數排序的兩趟掃描演算法。
首先,迭代計算出0、1 和 2 元素的個數,然後按照0、1、2的排序,重寫當前陣列。 - 你能想出一個僅使用常數空間的一趟掃描演算法嗎?
計數排序:
三路快排:
class Solution: def sortColors(self, nums): """ :type nums: List[int] :rtype: void Do not return anything, modify nums in-place instead. """ zero = 0 #nums[0:zero]=0統計0的個數 two = len(nums)#nums[two:n]=2統計2的個數 #nums[zero:two]=1 if two<1: pass i = 0 while i<two: if nums[i]<1: nums[zero],nums[i]=nums[i],nums[zero] zero+=1 i+=1 elif nums[i]>1: nums[i],nums[two-1]=nums[two-1],nums[i] two-=1 else: assert(nums[i]==1) i+=1
88. 合併兩個有序陣列
給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。
說明:
- 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。
- 你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來儲存 nums2 中的元素。
示例:
輸入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
輸出: [1,2,2,3,5,6]
歸併排序中的歸併:
class Solution: def merge(self, nums1, m, nums2, n): """ :type nums1: List[int] :type m: int :type nums2: List[int] :type n: int :rtype: void Do not return anything, modify nums1 in-place instead. """ i,j,k=0,0,0 nums=nums1[:] while i<m and j<n: if nums[i]<=nums2[j]: nums1[k]=nums[i] i+=1 else: nums1[k]=nums2[j] j+=1 k+=1 while i<m: nums1[k]=nums[i] i+=1 k+=1 while j<n: nums1[k]=nums2[j] j+=1 k+=1
215. 陣列中的第K個最大元素
在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。
示例 1:
輸入: [3,2,1,5,6,4] 和 k = 2 輸出: 5
示例 2:
輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4 輸出: 4
說明:
你可以假設 k 總是有效的,且 1 ≤ k ≤ 陣列的長度。
快排:O(n)時間複雜度
class Solution:
def findKthLargest(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
nums = sorted(nums,reverse=True)
return nums[k-1]
"""
leftmark = 0
rightmark = len(nums) - 1
mid = nums[rightmark // 2]
while leftmark <= rightmark:
while (nums[leftmark] > mid):
leftmark += 1
while (nums[rightmark] < mid):
rightmark -= 1
if (leftmark <= rightmark):
nums[leftmark], nums[rightmark] = nums[rightmark], nums[leftmark]
leftmark += 1
rightmark -= 1
if (k - 1 <= rightmark):
return self.findKthLargest(nums[: rightmark + 1], k)
if (k - 1 >= leftmark):
return self.findKthLargest(nums[leftmark :], k - leftmark)
return nums[k - 1]
相關推薦
玩轉演算法面試LeetCode演算法練習——基礎算法系列
目錄 75. 分類顏色 給定一個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。 此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。 注意: 不能使用程式碼庫中的
玩轉演算法面試LeetCode演算法練習——二分搜尋樹
目錄 235. 二叉搜尋樹的最近公共祖先 給定一個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。 百度百科中最近公共祖先的定義為:“對於有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x 的深
玩轉演算法面試LeetCode演算法練習——二叉樹與遞迴
目錄 104. 二叉樹的最大深度 給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,n
玩轉演算法面試LeetCode演算法練習——雙向佇列【堆(heapq)】
347. 前K個高頻元素 給定一個非空的整數陣列,返回其中出現頻率前 k 高的元素。 例如, 給定陣列 [1,1,1,2,2,3] , 和 k = 2,返回 [1,2]。 注意: 你可以假設給定的 k 總是合理的,1 ≤ k ≤ 陣列中不相同的元素的個數。 你的演
基礎算法系列之排序演算法-3. 直接插入排序 並用其解決HDU 1106 排序
我們之前已經學習了氣泡排序和二分查詢兩種基本演算法,本篇文章我們將一起學習下一個基礎演算法——直接插入排序演算法。 直接插入排序 直接插入排序,從這個名字來看,是不是讓你想到了什麼場景?!對了,就是打撲克牌的場景,我們每摸一張牌,是不是按照一定的次
基礎算法系列之排序演算法-5. 快速排序
我們之前學習了氣泡排序演算法,我們知道,在氣泡排序過程中,只對相鄰的兩個元素進行比較,因此每次交換兩個相鄰的元素時只能消除一個逆序。如果能通過兩個(不相鄰)元素的一次交換,消除多個逆序,則會大大加快排序的速度。而這就是本篇文章講述的另一種基本排序演算法——快速排序演算法。
基礎算法系列之排序演算法-6.折半插入排序 並用之解決hdu 1412問題
我們之前已經瞭解了5種基礎演算法,是否自己找了一些題練練手呢~話不多說,讓我們進入第6中基礎演算法的學習吧。本篇我們將學習又一種排序演算法——折半插入排序演算法,跟上篇我們所學習的快速排序有點像,都是建立在我們之前學習的演算法的基礎上改進而來的。從這個演算法的名
基礎算法系列之排序演算法-7.希爾排序 並解決hdu 1425問題(java實現)
我們從最初的氣泡排序演算法,到上篇文章的折半插入排序演算法,我們一共學習了5種排序演算法,相信以大家的聰明才智肯定都消化了^_^。在本篇文章中,我們又將學習第6種排序演算法——希爾排序演算法。那就讓我們直奔主題吧。 希爾排序 讓我們回想一下直接插入排序演算
決策分類樹演算法之ID3,C4.5算法系列
一、引言 在最開始的時候,我本來準備學習的是C4.5演算法,後來發現C4.5演算法的核心還是ID3演算法,所以又輾轉回到學習ID3演算法了,因為C4.5是他的一個改進。至於是什麼改進,在後面的描述中我會提到。 二、ID3演算法 ID3演算法是一種分類決策樹演算法。他通過一系
影象演算法之二:特徵提取算法系列之Harris
Harris運算元介紹: 該運算元是C.Harris和M.J.Stephens在1988年提出的一種點特徵提取運算元。這種運算元受訊號處理中自相關函式的啟發,可以給出影象中某一畫素點的自相關矩陣肘,其特徵值是自相關函式的一階曲率,如果X,Y兩個方向上的曲率值都
測試開發人員需瞭解的基礎算法系列(一)
背景介紹 演算法 這個近兩年由於大資料人工智慧的興起而被提及最多的關鍵詞之一,從而在IT這個猿類圈中有了基因變異-演算法工程師,被其他老猿類羨慕嫉妒恨,其實我覺得也沒必要去羨慕,做好我們自己在本職的崗位做到優秀也不會比別人差的,有的測試猿說測試不需要了解或者研
最新玩轉演算法面試 leetcode題庫分門別類詳細解析
課程簡介: 相信這是一門非常及時的演算法教程,送給面試在即的你,學完這門課程,對於面試中遇到的大多數演算法問題,你都會迎刃而解,但課程絕不止於面試,同樣適合即將參加各類演算法競賽的同學,重要的是提升你的演算法思維,這將是貫穿你程式設計生涯的核心內功!課程並非只是
玩轉演算法面試 leetcode題庫分門別類詳細解析教程
課程名稱: 玩轉演算法面試 leetcode題庫分門別類詳細解析視訊教程課程簡介: 相信這是一門非常及時的演算法教程,送給面試在即的你,學完這門課程,對於面試中遇到的大多數演算法問題,你都會迎刃而解,但課程絕不止於面試,同樣適合即將參加各類演算法競賽的
【演算法】LeetCode演算法題-Length Of Last Word
這是悅樂書的第155次更新,第157篇原創 01 看題和準備 今天介紹的是LeetCode演算法題中Easy級別的第14題(順位題號是58)。給定一個字串,包含戴爾字母、小寫字母和空格,返回最後一個單詞的長度,如果最後一個單詞不存在則返回0。另外,單詞不包含空格。例如:
【演算法】LeetCode演算法題-Maximum Subarray
這是悅樂書的第154次更新,第156篇原創 01 看題和準備 今天介紹的是LeetCode演算法題中Easy級別的第13題(順位題號是53)。給定一個整數陣列nums,找出一個最大和,此和是由陣列中索引連續的元素組成,至少包含一個元素。例如: 輸入:[-2, 1, -
【演算法】LeetCode演算法題-Count And Say
這是悅樂書的第153次更新,第155篇原創 01 看題和準備 今天介紹的是LeetCode演算法題中Easy級別的第12題(順位題號是38)。count-and-say序列是整數序列,前五個術語如下: 1 11 21 1211
【演算法】LeetCode演算法題-Palindrome Number
這是悅樂書的第144次更新,第146篇原創 今天這道題和迴文有關,即從前往後和從後往前是一樣的,如“上海自來水來自海上”就是一個迴文字串,如整數121就是迴文數,這些都是和迴文相關的。 01 看題和準備 今天介紹的是LeetCode演算法題中Easy級別的第3題
【演算法】LeetCode演算法題-Roman To Integer
這是悅樂書的第145次更新,第147篇原創 今天這道題和羅馬數字有關,羅馬數字也是可以表示整數的,如“I”表示數字1,“IV”表示數字4,下面這道題目就和羅馬數字有關,你能猜到嗎? 01 看題和準備 今天介紹的是LeetCode演算法題中Easy級別的第4題(順
【演算法】LeetCode演算法題-Longest Common Prefix
這是悅樂書的第146次更新,第148篇原創 01 看題和準備 今天介紹的是LeetCode演算法題中Easy級別的第5題(順位題號是14),給定一個隨機的字串陣列,查詢這些字串元素的公共字首字串,如果沒有則返回空串。其中,字串陣列中的元素都是由小寫字母a-z之間
【演算法】LeetCode演算法題-Valid Parentheses
這是悅樂書的第147次更新,第149篇原創 01 看題和準備 今天介紹的是LeetCode演算法題中Easy級別的第6題(順位題號是20),給定一個只包含字元’(’,’)’,’{’,’}’,’[‘和’]'的字串,確定輸入字串是否有效。輸入的字串必須使用相同型別的