LeetCode:零钱兑换322、摆动排序324的python解法

这篇博客介绍了LeetCode中的两道题目:零钱兑换和摆动排序。对于零钱兑换问题,博主采用了动态规划思想,通过递归方式计算最少硬币数。而在摆动排序中,博主先对数组排序,然后从小数和大数集合中倒序交替插入元素,以确保序列符合摆动排序的要求。每部分都有详细的解题思路和完整代码展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、零钱兑换


1.1 题目描述

在这里插入图片描述

1.2 解题思路

采用动态规划的思想,假设当金额为 a m o u n t amount amount时,需要的硬币数为 c o i n [ a m o u n t ] coin[amount] coin[amount],凑成它的硬币数可以被表示为: c o i n [ a m o u n t − k ] + 1 coin[amount-k]+1 coin[amountk]+1,其中 k k k表示硬币的面值。

每个金额下的最少硬币数都可以由更少金额下的硬币数推算出来,从而逐步得到金额为 a m o u n t amount amount时的最少硬币数;

例如,假设目前硬币面值有1,2,5三种,那么:

c o i n [ 1 ] = c o i n [ 2 ] = c o i n [ 5 ] = 1 coin[1] = coin[2] = coin[5] = 1 coin[1]=coin[2]=coin[5]=1
c o i n [ 7 ] = c o i n [ 7 − 2 ] + 1 , c o i n [ 7 ] = c o i n [ 7 − 5 ] + 1 , c o i n [ 7 ] = c o i n [ 7 − 1 ] + 1 coin[7] = coin[7-2] +1, coin[7] = coin[7-5] + 1,coin[7]=coin[7-1]+1 coin[7]=coin[72]+1coin[7]=coin[75]+1coin[7]=coin[71]+1


1.3 完整代码
class Solution(object):
    def coinChange(self, coins, amount):
        
        res = [0 for i in range(amount+1)]
        
        for i in range(1, amount+1):    
            
            # -1表示没有任意一种组合能够组成总金额
            res[i] = -1
            
            for coin in coins:
                if i-coin == 0:
                    res[i] = 1
                elif i-coin > 0 and res[i-coin] != -1:
                    if res[i] == -1:
                        res[i] = res[i-coin]+1
                    else:
                        res[i] = min(res[i], res[i-coin]+1)
                    
        
        return res[amount]

二、摆动排序


2.1 题目描述

在这里插入图片描述

2.2 解题思路

首先,将无序数组进行排序,并将排序后的结果分为大数和小数两个部分,为了得到 n u m s [ 0 ] &lt; n u m s [ 1 ] &gt; n u m s [ 2 ] &lt; n u m s [ 3 ] . . . . nums[0]&lt;nums[1]&gt;nums[2]&lt;nums[3].... nums[0]<nums[1]>nums[2]<nums[3]....这样的摆动队列,我们从大数和小数集合中交替插入数据,产生一个新的序列。

例如,原始序列为 n u m s = [ 1 , 5 , 1 , 1 , 6 , 4 ] nums=[1,5,1,1,6,4] nums=[1,5,1,1,6,4],排序之后,得到大数部分 [ 4 , 5 , 6 ] [4,5,6] [4,5,6]和小数部分 [ 1 , 1 , 1 ] [1,1,1] [1,1,1],倒序交替插入,得到 [ 1 , 4 , 1 , 5 , 1 , 6 ] [1,4,1,5,1,6] [1,4,1,5,1,6]

不使用顺序交替插入的原因是,当原始序列为 [ 1 , 2 , 4 , 4 , 4 , 6 ] [1,2,4,4,4,6] [124446]时,顺序插入的结果为 [ 1 , 4 , 2 , 4 , 4 , 6 ] [1,4,2,4,4,6] [1,4,2,4,4,6],不满足要求,因此,我们希望小数部分中最大的数处于边界位置,所以倒序插入效果更好。

此外,在划分大数部分和小数部分时,要求后者的序列长度不小于前者。


2.3 完整代码
class Solution(object):
    def wiggleSort(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        
        nums.sort()
        
        half = int((len(nums)+1)/2)
        small_nums = nums[0: half]
        large_nums = nums[half: len(nums)]

        
        res = [0 for i in nums]
        
        for i in range(len(small_nums)):
            nums[i*2] = small_nums[len(small_nums) - 1 - i]
        
        
        for i in range(len(large_nums)):
            nums[i*2 + 1] = large_nums[len(large_nums) - 1 - i]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值