六十四、開始刷Leetcode之旅(Python版本)

@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的做法:

  1. 打開leetcode
  2. 啓動Pycharm
  3. 開始思考,冷靜分析
  4. 打開leetcode官網的評論區答案,尋找跟我一樣的菜逼
  5. 滿意離開評論區

上面其實都是像之前的我,都是菜雞,其實現在我還是菜雞。

分類歸納/總結

刷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,學了下面的課程


因此下面的文章主要是總結回顧之前學到東西,只有不斷地反覆學習,纔有新的突破

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章