小李飛刀:作題第九彈!

寫在前面的話

感受作題越多遇到的寫法越多,有種躍躍欲試的感受~算法

認真作題

第一題

70. 爬樓梯
難度:簡單
假設你正在爬樓梯。須要 n 階你才能到達樓頂。
每次你能夠爬 1 或 2 個臺階。你有多少種不一樣的方法能夠爬到樓頂呢?
注意:給定n是一個正整數。
個人題解:數組

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        old = 1
        new = 1
        for i in range(2,n+1):
            old,new = new,new+old
        return newv

clipboard.png

個人思路:
這題是一個標準的動態規劃的題目,第二步所須要的步數實際上是基於第一步,第三步則基於第二步。
用筆計算就能夠看出,有必定的規律,新的一步的最優解等於前面一步的最優解+以前全部步數的最優解。
不過可能尚未抓到動態規劃的真諦,總以爲哪裏須要再校訂下思路。函數

第二題

771. 寶石與石頭
難度:簡單
給定字符串J表明石頭中寶石的類型,和字符串S表明你擁有的石頭。S中每一個字符表明了一種你擁有的石頭的類型,你想知道你擁有的石頭中有多少是寶石。
J中的字母不重複,JS中的全部字符都是字母。字母區分大小寫,所以"a"和"A"是不一樣類型的石頭。
個人題解:優化

class Solution(object):
    def numJewelsInStones(self, J, S):
        """
        :type J: str
        :type S: str
        :rtype: int
        """
        num = 0
        if not J or not S:
            return 0
        map = {}
        for i in J:
            map[i] = 1
        for j in S:
            if j in map:
                num += map[j]
        return num

clipboard.png

個人思路:
這題用了hash表的思路,將J裏的每一個字母單獨存成哈希表的一個鍵,且對應的值爲1。
這樣當S進行搜索的時候,對應將值相加便可獲得結果。spa

第三題

709. 轉換成小寫字母
難度:簡單
實現函數 ToLowerCase(),該函數接收一個字符串參數 str,並將該字符串中的大寫字母轉換成小寫字母,以後返回新的字符串。
個人題解:code

class Solution(object):
    def toLowerCase(self, str):
        """
        :type str: str
        :rtype: str
        """
        s = list(str)
        map = {'A':'a','B':'b','C':'c','D':'d','E':'e','F':'f','G':'g','H':'h','I':'i','J':'j','K':'k','L':'l','M':'m','N':'n','O':'o','P':'p','Q':'q','R':'r','S':'s','T':'t','U':'u','V':'v','W':'w','X':'x','Y':'y','Z':'z'}
        for i in range(len(s)):
            if s[i] in map:
                s[i] = map[s[i]]
        s1=''.join(s)
        return s1

clipboard.png

個人思路:
這題....大概寫法很是土了....emmm
認真的寫了個字典,而後對應的寫一下,效率也還能夠,可是隻能用於數量少的狀況下,還能夠看下有沒有其餘的寫法。blog

第四題

62. 不一樣路徑
難度:中等
個人題解:ip

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        dp = [[0 for _ in range(m)] for _ in range(n)] #創建二維數組
        for i in range(n):
            for j in range(m):
                if i ==0 or j ==0:
                    dp[i][j] = 1
                else:
                    dp[i][j] = dp[i-1][j] + dp[i][j-1]
        return dp[n-1][m-1]

clipboard.png

個人思路:
很是粗暴的畫了網格圖,而後發現了規律,
dp[i][j] = dp[i-1][j] + dp[i][j-1],
和少棉在討論的時候,很是真摯的爲了爲何他知道須要是左邊的值加上上方的值,
給的說法是最優解的目標就是從左上角到該位置的最優解,局部最優再到全局最優。
這題也是動態規劃的題目,目標老是要分解爲子問題。leetcode

總結

看《算法圖解》的時候,涉及動態規劃的小結中有這樣的字符串

  • 每種動態規劃解決方案都涉及網格。
  • 單元格中的值一般就是你要優化的值
  • 每一個單元格都是一個子問題,由於你須要考慮如何將問題分解爲子問題。
相關文章
相關標籤/搜索