1. 程式人生 > >玩轉演算法面試LeetCode演算法練習——基礎算法系列

玩轉演算法面試LeetCode演算法練習——基礎算法系列

目錄

75. 分類顏色

給定一個包含紅色、白色和藍色,一共 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。

此題中,我們使用整數 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),給定一個只包含字元’(’,’)’,’{’,’}’,’[‘和’]'的字串,確定輸入字串是否有效。輸入的字串必須使用相同型別的