python leetcode 474. Ones and Zeroes

221 篇文章 2 订阅

官方提示DP自己用DP做会超时,哈哈哈官方打脸。看了40ms的方法,采用了贪心算法。

  1. 按照字符串0或1少的顺序排列
  2. 按照取完这个字符串后剩余0或1较多的逆序排列
    第2种是对第一种情况的补充例如一个字符串011111111111,0只有一个1很多个
    第一种情况对应Array = {“10”, “0001”, “111001”, “1”, “0”}, m = 5, n = 3
    第二种情况对应Array = {“01111”, “001”, “100”}, m = 4, n = 4
class Solution:
    def findMaxForm(self, strs, m, n):
        """
        :type strs: List[str]
        :type m: int
        :type n: int
        :rtype: int
        """
        counter = [[i.count('0'), i.count('1')] for i in strs]
        s1 = sorted(counter,key=lambda x:min(x[0],x[1]))
        s2 = sorted(counter,key=lambda x:min(m-x[0],n-x[1]),reverse=True)
        return max(self._findMaxForm(s1, m, n),self._findMaxForm(s2, m, n))

    def _findMaxForm(self, s, m, n):
        count = 0
        for k in s:
            if m >= k[0] and n >= k[1]:
                count += 1
                m -= k[0]
                n -= k[1]
        return count
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值