六十6、Leetcode數組系列(中篇)


@Author:Runsennode

@Date:2020/6/8web



人生最重要的不是所站的位置,而是心裏所朝的方向。只要我在每篇博文中寫得本身體會,修煉身心;在天天的不斷重複學習中,耐住寂寞,練就真功,不畏艱難,奮勇前行,不忘初心,砥礪前行,人生定會有所收穫,不留遺憾 (做者:Runsen )面試

做者介紹:Runsen目前大三下學期,專業化學工程與工藝,大學沉迷日語,Python, Java和一系列數據分析軟件。致使翹課嚴重,專業排名中下。.在大學60%的時間,都在CSDN。決定今天比昨天要更加努力。前面文章,點擊下面連接算法

個人Python教程,不斷整理,反覆學習 (點擊閱讀原文)數組

今日,我決定繼續更新Python教程,今天就見識下刷Leetcode的快樂。微信



Runsen先打開Pycharm,app

劍指 Offer 系列 面試題03.:數組中重複的數字

先來一個簡單的,見面禮。題目來源於 LeetCode 上的劍指 Offer 系列 面試題03. 數組中重複的數字。編輯器

題目連接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/svg

#找出數組中重複的數字。 
#在一個長度爲 n 的數組 nums 裏的全部數字都在 0~n-1 的範圍內。數組中某些數字是重複的,但不知道有幾個數字重複了,也不知道每一個數字重複了幾回。請找出數組中任意一個重複的數字。 
#
# 示例 1: 
#
# 輸入:
#[2310253]
#輸出:2 或 3 
#
# 限制: 
2 <= n <= 100000 
# Related Topics 數組 哈希表

先進行數據的排序,而後看相鄰元素是否有相同的,有直接return。不過很慢,時間O(nlogn)了,空間O(1),可是代碼很簡單。學習

'''
@Author:Runsen
@微信公衆號: 潤森筆記
@博客:https://blog.csdn.net/weixin_44510615
@Date:2020/6/10
'''

def findRepeatNumber(nums):
    nums.sort()
    for i in range(len(nums) -1):
        if nums[i]  ==  nums[i+1]:
            return nums[i]
nums = [2310253]
print(findRepeatNumber(nums))
2

若是用哈希表,就是字典,遍歷整個數組,當這個數字沒有出現過字典的時候將其加入進去,若是在哈希表中則直接返回便可。時間複雜度O(n),空間複雜度O(n)

def findRepeatNumber1(nums):
    dict = {}
    for i in nums:
        if i not  in dict:
            dict[i] = 0
        else:
            return i
nums = [2310253]
print(findRepeatNumber1(nums))
2

LeetCode 第 5 題:最長迴文子串

題目連接:https://leetcode-cn.com/problems/longest-palindromic-substring/

#給定一個字符串 s,找到 s 中最長的迴文子串。你能夠假設 s 的最大長度爲 1000。 
#
# 示例 1: 
#
# 輸入: "babad"
#輸出: "bab"
#注意: "aba" 也是一個有效答案。
# 示例 2: 
#
# 輸入: "cbbd"
#輸出: "bb"

定義一個判讀迴文子串的方法 遍歷字符串比較迴文子串的長度

好比說字符串abacd,反過來是dcaba,它倆的最長公共子串是aba,也就是最長迴文子串。

可是這個思路是錯誤的,好比說字符串aacxycaa,反轉以後是aacyxcaa,最長公共子串是aac,可是最長迴文子串應該是aa。

算法一:枚舉s全部子串,知足迴文的同時,知足最長 結果: ,同窗請你出門右轉

算法二:遍歷s的每一個字符,(奇數)以該字符爲中心,向左向右同時遍歷,(偶數)以兩個字符爲中心,向左向右同時遍歷,當不知足迴文時中止,最終篩選最長迴文串 結果: ,嗯,還能夠,那你完整寫出來吧

算法三:Manacher算法,爲最長迴文子串而生,O(N),瞭解一下就放棄。

迴文中心的兩側互爲鏡像。所以,迴文能夠從他的中心展開,而且只有2n-1個這樣的中心(一個元素爲中心的狀況有n個,兩個元素爲中心的狀況有n-1個)。

# 迴文的長度是奇數仍是偶數的狀況,若是是奇數形迴文,就以當前字符爲中心左右兩邊尋找,例如迴文"bab";若是是偶數形迴文,須要兩個字符,而且這兩個字符是相等的,則須要以當前字符和其相鄰的字符爲中心向左右兩邊尋找,例如迴文"abba"。
def longestPalindrome(s):
    res = ""
    for i in range(len(s)):
        # 奇數形迴文, like "aba"
        tmp = helper(s, i, i)
        if len(tmp) > len(res):
            res = tmp
        # 偶數形迴文, like "abba"
        tmp = helper(s, i, i + 1)
        if len(tmp) > len(res):
            res = tmp
    return res

def helper(s, l, r):
    # 中心擴散
    while l >= 0 and r < len(s) and s[l] == s[r]:
        l -= 1
        r += 1
    return s[l + 1:r]


if __name__ == '__main__':
    longestPalindrome('abasfggttg')

LeetCode 第 53 題:最大子序和

#給定一個整數數組 nums ,找到一個具備最大和的連續子數組(子數組最少包含一個元素),返回其最大和。 
#
# 示例: 
#
# 輸入: [-2,1,-3,4,-1,2,1,-5,4],
#輸出: 6
#解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。

定義當前子序和以及最大子序和爲數組的一個元素;

遍歷整數數組,比較當前子序和的值及當前遍歷的值,取較大值重置賦值給當前子序和 cur_sum;

同時比較當前子序和及最大子序和的值,取較大值重置賦值給最大子序和 max_sum;

遍歷結束,返回最大子序和的值 max_sum。

def maxSubArray( nums):
    '''查找連續子數組的最大和
    '''

    # 比較當前子序和,最大子序和,返回最大值
    # 定義當前子序和以及最大子序和爲第一個元素
    cur_sum = max_sum = nums[0]
    # 遍歷整數數組
    for x in range(1, len(nums)):
        # 比較當前值和當前子序和的值,取較大值
        cur_sum = max(nums[x], cur_sum + nums[x])
        # 比較當前值和定義的最大子序和值,將最大值重置賦值給 max_sum
        max_sum = max(cur_sum, max_sum)
    return max_sum
print(maxSubArray([-2,1,-3,4,-1,2,1,-5,4]))
6

LeetCode 第88題 :合併兩個有序數組

#給你兩個有序整數數組 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成爲一個有序數組。 
# 初始化 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] 




合併兩個列表再排序,簡單。

def merge(nums1, nums2):
    nums1[:] =  sorted(nums1[:m] + nums2[:n])

由於自己就是有序,經過 雙指針法 達到 的時間複雜度。

最直接的算法實現是將指針p1 置爲 nums1的開頭, p2爲 nums2的開頭,在每一步將最小值放入輸出數組中。

因爲 nums1 是用於輸出的數組,須要將nums1中的前m個元素放在其餘地方,也就須要 的空間複雜度。

def merge(nums1,m, nums2,n):
    # Make a copy of nums1.
    nums1_copy = nums1[:m]
    nums1[:] = []

    # Two get pointers for nums1_copy and nums2.
    p1 = 0
    p2 = 0

    # Compare elements from nums1_copy and nums2
    # and add the smallest one into nums1.
    while p1 < m and p2 < n:
        if nums1_copy[p1] < nums2[p2]:
            nums1.append(nums1_copy[p1])
            p1 += 1
        else:
            nums1.append(nums2[p2])
            p2 += 1

    # if there are still elements to add
    if p1 < m:
        nums1[p1 + p2:] = nums1_copy[p1:]
    if p2 < n:
        nums1[p1 + p2:] = nums2[p2:]
    return nums1

nums1 = [1,2,3,0,0,0]
nums2 = [2,5,6]
print(merge(nums1,3,nums2,3))
[122356]

LeetCode 第118題 :楊輝三角

#給定一個非負整數 numRows,生成楊輝三角的前 numRows 行。 
# 在楊輝三角中,每一個數是它左上方和右上方的數的和。 
#
# 示例: 
#
# 輸入: 5
#輸出:
#[
#     [1],
#    [1,1],
#   [1,2,1],
#  [1,3,3,1],
# [1,4,6,4,1]
#] 
# Related Topics 數組

第一行第二行都是1,每行第一個和最後一個都爲1,假設任意一個位置的數x,索引座標是(m,n),則x就是該數 正上方的數 和 左上方那個數 之和。即(m-1,n),(m-1,n-1)兩數和。

def generate(numRows):
    if numRows == 0return []
    triangle = [[1]]
    if numRows == 1return triangle
    for i in range(1, numRows):
        tmp = [1]
        for j in range(1, i):
            tmp.append(triangle[i - 1][j - 1] + triangle[i - 1][j])
        tmp.append(1)
        triangle.append(tmp)
    return triangle
print(generate(5))
[[1], [11], [121], [1331], [14641]]

若是本文對你有幫助,你們能夠點贊轉發一波,有錯誤你們能夠評論指出,感謝!

最近有人問我,有沒有技術交流羣,其實我是不想管的,又沒錢又浪費時間,建了又是廣告,無語。若是須要建羣了,我看看票數先。

本文分享自微信公衆號 - Python之王(sen13717378202)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索