leetcode(402&&406) 貪心兩則

這兩個代碼都是徹底本身獨立想出來的,代碼還挺簡潔的...加油~mtgit

leetcode 402算法

給定一個以字符串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。app

注意:spa

num 的長度小於 10002 且 ≥ k。
num 不會包含任何前導零。
示例 1 :code

輸入: num = "1432219", k = 3
輸出: "1219"
解釋: 移除掉三個數字 4, 3, 和 2 造成一個新的最小的數字 1219。
示例 2 :blog

輸入: num = "10200", k = 1
輸出: "200"
解釋: 移掉首位的 1 剩下的數字爲 200. 注意輸出不能有任何前導零。
示例 3 :隊列

輸入: num = "10", k = 2
輸出: "0"
解釋: 從原數字移除全部的數字,剩餘爲空就是0。leetcode

核心: 問題轉換 --選取長度爲len(nums)-k的子序列,是子序列字典序最小rem

 1 class Solution:
 2     def removeKdigits(self, num: str, k: int) -> str:
 3         ans = []
 4         lenth = len(num)-k
 5         for it in num:
 6             while k and ans and ans[-1]>it:
 7                 ans.pop()
 8                 k -= 1
 9             ans.append(it)
10         ans = ans[:lenth]
11         pos = 0
12         while pos<len(ans) and ans[pos]=='0':
13             pos+=1
14         ans = ans[pos:]
15         return "".join(ans) if len(ans) else '0'

leetcode  406字符串

假設有打亂順序的一羣人站成一個隊列。 每一個人由一個整數對(h, k)表示,其中h是這我的的身高,k是排在這我的前面且身高大於或等於h的人數。 編寫一個算法來重建這個隊列。

注意:
總人數少於1100人。

示例

輸入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

輸出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

class Solution:
    def reconstructQueue(self, people):
        people.sort(key=lambda x: (-x[0], x[1]))
        ans = []
        for it in people:
            ans.insert(it[1], it)
        return ans
相關文章
相關標籤/搜索