leetcode(402&&406) 贪心两则

这两个代码都是完全自己独立想出来的,代码还挺简洁的...加油~mt

leetcode 402

给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。

注意:

num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。
示例 1 :

输入: num = "1432219", k = 3
输出: "1219"
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。
示例 2 :

输入: num = "10200", k = 1
输出: "200"
解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
示例 3 :

输入: num = "10", k = 2
输出: "0"
解释: 从原数字移除所有的数字,剩余为空就是0。

核心: 问题转换 --选取长度为len(nums)-k的子序列,是子序列字典序最小

 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

猜你喜欢

转载自www.cnblogs.com/xidian-mao/p/11420327.html