一、零钱兑换
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[amount−k]+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[7−2]+1,coin[7]=coin[7−5]+1,coin[7]=coin[7−1]+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 ] < n u m s [ 1 ] > n u m s [ 2 ] < n u m s [ 3 ] . . . . nums[0]<nums[1]>nums[2]<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] [1,2,4,4,4,6]时,顺序插入的结果为 [ 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]