@Author:Runsennode
@Date:2020/6/8web
人生最重要的不是所站的位置,而是心裏所朝的方向。只要我在每篇博文中寫得本身體會,修煉身心;在天天的不斷重複學習中,耐住寂寞,練就真功,不畏艱難,奮勇前行,不忘初心,砥礪前行,人生定會有所收穫,不留遺憾 (做者:Runsen )面試
做者介紹:Runsen目前大三下學期,專業化學工程與工藝,大學沉迷日語,Python, Java和一系列數據分析軟件。致使翹課嚴重,專業排名中下。.在大學60%的時間,都在CSDN。決定今天比昨天要更加努力。前面文章,點擊下面連接算法
個人Python教程,不斷整理,反覆學習 (點擊閱讀原文)數組
今日,我決定繼續更新Python教程,今天就見識下刷Leetcode的快樂。微信
![](http://static.javashuo.com/static/loading.gif)
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:
#
# 輸入:
#[2, 3, 1, 0, 2, 5, 3]
#輸出: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 = [2, 3, 1, 0, 2, 5, 3]
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 = [2, 3, 1, 0, 2, 5, 3]
print(findRepeatNumber1(nums))
2
![](http://static.javashuo.com/static/loading.gif)
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')
![](http://static.javashuo.com/static/loading.gif)
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])
![](http://static.javashuo.com/static/loading.gif)
由於自己就是有序,經過 雙指針法 達到 的時間複雜度。
最直接的算法實現是將指針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))
[1, 2, 2, 3, 5, 6]
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 == 0: return []
triangle = [[1]]
if numRows == 1: return 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], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]
![](http://static.javashuo.com/static/loading.gif)
若是本文對你有幫助,你們能夠點贊轉發一波,有錯誤你們能夠評論指出,感謝!
最近有人問我,有沒有技術交流羣,其實我是不想管的,又沒錢又浪費時間,建了又是廣告,無語。若是須要建羣了,我看看票數先。
本文分享自微信公衆號 - Python之王(sen13717378202)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。