贪心1

作者: Arsenal4ever | 来源:发表于2019-12-30 22:59 被阅读0次

贪心的捷径:使用状态机 (自己画状态机,然后编代码)

预备知识:贪心法找零钱

思路:** 尽可能多的使用面值大的钞票!**

def recMCOther(coinValueList, change):
    # 该解法前提条件:coinValueList 为整数倍的,从大到小排列!!!
    minCoins = 0
    for coin in coinValueList:
        use = change // coin
        minCoins += use
        change = change - coin * use

    return minCoins

if __name__ == '__main__':
    print(recMCOther([200, 100, 20, 10, 5, 1], 628))

demo1:分糖果 (easy) ---- (排序,贪心)

来源:leetcode 455

类似题目:田忌赛马

思路:while双遍历,想好糖果和孩子什么时候进行转换!!!

# 糖果问题
def findContentChildren(g, s):
    # g: 需求因子列表
    # s: 糖果大小列表
    child, candy = 0, 0
    while child < len(g) and candy < len(s):
        if g[child] < s[candy]:
            child += 1
        candy += 1
    return child

if __name__ == '__main__':
    print(findContentChildren([1, 3, 5, 10], [2, 2, 4, 11]))

demo2:摇摆序列 (medium) ---- (贪心)

来源:leetcode 376

思路:状态机,画图,写状态转换条件

微信图片_20191231122102.png
# 摇摆序列 (leetcode 376)
class Solution(object):
    def wiggleMaxLength(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) < 2:
            return len(nums)

        self.state = 0
        self.max_length = 1

        for i in range(1, len(nums)):
            if self.state == 0:
                self.begin(i, nums)
            elif self.state == 1:
                self.up(i, nums)
            elif self.state == 2:
                self.down(i, nums)            
        return self.max_length
    
    def begin(self, i, nums):
        if nums[i-1] > nums[i]:   # 下降
            self.state = 2
            self.max_length += 1
        elif nums[i-1] < nums[i]: # 上升
            self.state = 1
            self.max_length += 1
    
    def up(self, i, nums):
        if nums[i-1] > nums[i]:   # 下降
            self.state = 2
            self.max_length += 1
    
    def down(self, i, nums):
        if nums[i-1] < nums[i]:   # 上升
            self.state = 1
            self.max_length += 1

demo3: 移出 k 个数字 (medium) ---- (栈,贪心)

来源:leetcode 402

思路:看下图

微信图片_20191231133409.png
class Solution(object):
    def removeKdigits(self, num, k):
        """
        :type num: str
        :type k: int
        :rtype: str
        """
        stack = []
        for i in range(len(num)):
            # 小于栈顶 --> 弹栈后入栈; 否则直接入栈
            while stack != [] and num[i] < stack[-1] and k > 0:
                stack.pop()
                k -= 1
            if num[i] != "0" or stack != []:    # 注意 "0",双引号不要丢
                stack.append(num[i])
        # k 还有剩余的情况
        while k > 0 and stack != []:
            stack.pop()
            k -= 1
        ans = ''.join(stack)
        return ans if ans else "0"    # 最后可能会栈空,返回 0
                   

相关文章

  • 贪心1

    贪心的捷径:使用状态机 (自己画状态机,然后编代码) 预备知识:贪心法找零钱 思路:** 尽可能多的使用面值大的钞...

  • 如何指定战略路径

    1.打破贪心算法,找到全局最优 1)贪心算法 2)全局最优 要有价值主张,数据代表过去,避免过度依赖贪心算法 3)...

  • 【算法打卡60天】Day29贪心算法:如何用贪心算法实现Huff

    Day29学习内容 :贪心算法:如何用贪心算法实现Huffman压缩编码? 1.如何理解贪心算法?贪心算法解决问题...

  • 五大常用算法

    1.贪心算法 贪心算法的要素 1)贪心选择性质:可以通过局部最优选择来构造全局最优解。换言之,直接做出在当前问题中...

  • 算法讲解|贪心算法的理解与分析

    贪心算法 Part 1 贪心算法简介 ​ Part 2 解题一般步骤 1、 设计数据找规律; 2、 ...

  • 12《算法入门教程》贪心算法

    1. 前言 本节内容是贪心算法系列之一:贪心算法的介绍,主要介绍了贪心算法的定义,贪心算法的使用条件,明确了什么样...

  • 数据结构第二季 Day16 贪心、分治

    一、贪心(Greedy) 1、什么是贪心策略?经典应用有哪些(至少说两个)? 贪心策略,也称为贪婪策略。 每一步都...

  • 生活更魔幻——写实派公众号推荐

    1、花神妙 2、贪心记

  • 贪心y1

    葱翠的山岚 美丽如约 我好贪心哦 贪心地想把人间温暖 留在这里 让所有的温馨记忆留得久一些 再久一些

  • 贪心的小猪1

    一天,小猪在狮子国王那得到了一些金钱,开心极了! 没过一会儿,小猪就来到了小鹿的饭店,用狮子国王给他的金钱大吃大喝...

网友评论

    本文标题:贪心1

    本文链接:https://www.haomeiwen.com/subject/rrdvoctx.html