【贪心】【数组】
LCP 06. 拿硬币
数组 coins
中存放的是一堆堆的力扣币,对于每一堆力扣币,你可以选择拿走一枚或者两枚,请返回拿走所有乐扣币的最少次数。
我们利用贪心的思想来解决。
题目意思明确,对于每一堆的力扣币我们可以拿一枚也可以拿两枚,对于每一堆我们能拿两枚就拿两枚,不能拿两枚我们就拿一枚,这样拿完这一堆的力扣币次数最少,我们对每一堆拿取的次数最少(局部最优)促成了拿完所有力扣币的最少次数(全局最优)。
具体地,我们对 2
取上整,即可实现贪心策略。
a
对 b
取下整可以这样实现: ⌊ a b ⌋ = a / b \lfloor \frac{a}{b} \rfloor = a / b ⌊ba⌋=a/b;a
对 b
取上整可以这样实现: ⌈ a b ⌉ = ( a + b − 1 ) / b = ( b − 1 ) / a + 1 \lceil \frac{a}{b} \rceil = (a + b - 1) / b = (b - 1) / a + 1 ⌈ba⌉=(a+b−1)/b=(b−1)/a+1。
实现代码
复杂度分析
时间复杂度: O ( n ) O(n) O(n), n n n 为数组 coins
的长度。
空间复杂度: O ( 1 ) O(1) O(1)。
除了以上介绍的两种向上、向下取整方式之外,还有一些其他方法可以进行向上、向下取整。
需要强调的是向上、向下取整是对于浮点类型的取整,或者运算过程中出现的浮点类型取整。
对 x
向上取整是返回大于等于 x
的最小整数,用 ⌈ x ⌉ \lceil x \rceil ⌈x⌉ 表示,比如 ⌈ 2.3 ⌉ = 3 \lceil 2.3 \rceil = 3 ⌈2.3⌉=3。计算方法有 ceil(x),需要注意的是 ceil(x)
返回的是 double
类型、float
类型或者 long double
类型,具体的返回值类型适 x
的类型而定,使用完毕后还需要强转为整型数据。
对 x
向下取整是返回小于等于 x
的最大整数,用 ⌊ x ⌋ \lfloor x \rfloor ⌊x⌋ 表示,比如 ⌊ 2.3 ⌋ = 2 \lfloor 2.3 \rfloor = 2 ⌊2.3⌋=2。计算方法有 floor(x), floor(x)
返回的也是 double
类型、float
类型或者 long double
类型,具体的返回值类型适 x
的类型而定,使用完毕后还需要强转为整型数据。
对 x
向下取整操作还可以直接使用 int
类型进行强转,比如 ⌊ 3.7 ⌋ = ( i n t ) 3.7 = 3 \lfloor 3.7 \rfloor = (int)3.7 = 3 ⌊3.7⌋=(int)3.7=3。
如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 。
如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。
最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 哦。