@Author:Runsen
@Date:2020/6/4
作者介紹:Runsen目前大三下學期,專業化學工程與工藝,大學沉迷日語,Python, Java和一系列數據分析軟件。導致翹課嚴重,專業排名中下。.在大學60%的時間,都在CSDN。決定今天比昨天要更加努力。
從大一寫Python文章,到現在其都有上百篇,現在到了六十四,我覺得這個時候應該去刷題了,其實很多學Python的都不是專科的,都是給培訓機構宣傳牛逼,其實在編程語言中,Python是最簡單,最沒有難度的編程語言。我在之後的文章都更新數據結構和Leetcode。都用Python解決的方法。其實Leetcode上的一部分題我都基本刷過,那麼我就開始吧。
註冊Leetcode賬號
目前Leetcod有國際和中文的兩個版本,下圖就是我的中文版本,刷的不夠,其實我也挺菜的。這個是中文的網址:https://leetcode-cn.com/problemset/all/
下圖就是我的國際版本,其實我主要在國際版混日子,刷了100多題,其實我很菜的。這是它的官網,https://leetcode.com。
不同點,非中國區的人多點,做完了也可以參考下老外是用什麼思路做的,挺好的。所以你比要到非中國區,看看老外是怎麼幹的。
Pycharm裝Leetcode插件
直接打開Pycharm,依次點擊File-Settings-Plugins-Maketplace ,然後在搜索框輸入leetcode,就會顯示我們的leetcode editor插件,點擊Install,跳出的界面點檢accept,之後等待安裝好就行了
我這個是安裝好的了。
如果你用vscode也是一樣,給我裝vscode插件。
因爲,我習慣Python用Pycharm,Java用IDEA,前端用vscode。所以這Runsen使用Pycharm。
然後就是登陸我的Leetcode賬號。
然後就是登錄你的賬號。
點擊右下角,選擇刷新或者加載按鈕,就可以獲取到leetcode中題庫了,根據顏色可以區分題目的難易程度:
綠色-中等;
黃色-簡單;
紅色-困難
更詳細的使用說明參考文檔:https://github.com/shuzijun/leetcode-editor
怎麼刷Leetcode
以前菜雞的我做法
以前Runsen的做法:
- 打開leetcode
- 啓動Pycharm
- 開始思考,冷靜分析
- 打開leetcode官網的評論區答案,尋找跟我一樣的菜逼
- 滿意離開評論區
上面其實都是像之前的我,都是菜雞,其實現在我還是菜雞。
分類歸納/總結
刷Leetcode,必須分類歸納/總結
(1)、數組和相關題型
對於算法題,還是有很多種題型需要去總結的,如果你懂這個題型,以後遇到類似的題,相信很快就能做出來的。有哪些題型可以總結呢?答是非常多,例如:
(1)、給你一個非負數的數組,求最大子數組和的長度
這算是一個題型,關於這個題型,有很多種變形、拓展,這裏建議一起歸納總結,例如:
(2)、剛纔給的數組是非負數的,現在變一下,給的數組是可正可負。
還能繼續拓展嗎?答是可以的,例如:
(3)、給你個矩陣(即二維數組),求最大子矩陣和的面積
還有嗎?有,例如剛纔是求最大和,現在我改成求最大乘積。
我其實是想告訴你,對於前期的學習,我建議分類刷題,總結題型,像我上面舉的這些例子,遇到相似的,就直接可以秒殺了,因爲這類題,沒啥邊界或者規律。
關於題型的,還是很多的,我這裏無法一一給你列舉,只能靠你刷題的過程中,進行分類、總結。不過我可以給你推薦一些資料,後面推薦。下面我在說一些題型吧。
三分學七分練
三分學七分練,這是我從極客時間的覃超,前Facebook工程師,傳授的方法。
俗話說:學鋼琴,三分學,七分練。其中練習是最爲重要的一個環節,想學好鋼琴必須得時常練習且多多益善。
所以刷Leetcode的最大的弊端都是:缺乏練習。
兩數相加
那麼我們就開始幹他,Leetcode中的Hello World就是兩數相加。
這個題是我2018年遇見了,現在2020年半,兩年多時間。
#給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
#
# 你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。
#
# 示例:
#
# 給定 nums = [2, 7, 11, 15], target = 9
#
#因爲 nums[0] + nums[1] = 2 + 7 = 9
#所以返回 [0, 1]
#
# Related Topics 數組 哈希表
其實這一題真的很簡單,無非就是將“昂貴”的時間複雜度轉換成“廉價”的空間複雜度,把雙重遍歷,變成一次遍歷。
這裏最佳的方法就是使用字典。下面是我去年的代碼,就是三種的解決方法。
列表解法
def twoSum_1( nums, target):
result = []
for i in range (len(nums)):
onenum = nums[i]
twonum = target - onenum
if twonum in nums:
j = nums.index(twonum)
if i != j:
result.append(i)
result.append(j)
return result
字典解法
def twoSum_2(nums,target):
dict={}
for i in range(len(nums)):
m = nums[i]
if target-m in dict:
return [dict[target-m],i]
dict[m] = i
字典推導式
def twosum_3(nums,target):
l = len(nums)
dict = {nums[i]:i for i in range(l)}
print(dict)
for j in range(l):
a = nums[j]
b = target - a
if b in dict and j != dict[b]:
return [j,dict[b]]
關於學習課程
在之前深入Leetcode,學了下面的課程
因此下面的文章主要是總結回顧之前學到東西,只有不斷地反覆學習,纔有新的突破