文章目录
- Tag
- 题目来源
- 题目解读
- 解题思路
- 方法一:贪心
 
- 知识回顾
- 向上、向下取整
 
- 写在最后
Tag
【贪心】【数组】
题目来源
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。
写在最后
如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。
如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。
最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。



















