LeetCode 数组:2020 力扣杯:拿硬币

  • 如果评论区没有及时回复,欢迎来公众号:ByteCode 咨询
  • 公众号:ByteCode。致力于分享最新技术原创文章,涉及 Kotlin、Jetpack、算法、译文、系统源码相关的文章

题目来源于 2020 力扣杯!Code Your Future 春季全国编程大赛 01:拿硬币。题目难度为 Easy。

题目描述

桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数。

示例 1:

输入:[4,2,1]

输出:4

解释:第一堆力扣币最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,总共 4 次即可拿完。

示例 2:

输入:[2,3,10]

输出:8

限制:

1 <= n <= 4
1 <= coins[i] <= 10

思路

根据题意每次至少可以拿一枚或者两枚力口币,求拿完所有力扣币的最少次数,根据它的限制条件 1 <= coins[i] <= 10 列举可能性找规律

  • 当coins[1]时,第一次拿一枚,至少1次
  • 当coins[2]时,第一次拿两枚,至少1次
  • 当coins[3]时,第一次拿两枚,第二次拿一枚,至少2次
  • 当coins[4]时,第一次拿两枚,第二次拿两枚,至少2次
  • 当coins[5]时,第一次拿两枚,第二次拿两枚,第三次拿一枚,至少3次
  • 当coins[6]时,第一次拿两枚,第二次拿两枚,第三次拿两枚,至少3次
  • ……

综合以上情况,可以发现当 i 为偶数时,至少次数 = i/2,当 i 为奇数时,至少次数 = i/2 + i%2,代码如下:

复杂度分析:

  • 时间复杂度:O(n),n 为数组中元素的个数
  • 空间复杂度:O(1),占用常数大小的空间

Java实现

class Solution {
public int minCount(int[] coins) {
int sum = 0;
for (int i = 0; i < coins.length; i++) {
sum += coins[i] / 2;
if (coins[i] % 2 != 0) {
sum += 1;
}
}
return sum;
}
}

Koltin实现

class Solution {
fun minCount(coins: IntArray): Int {
var sum = 0
coins.forEach { value ->
sum += value / 2
if (value % 2 != 0) sum += 1
}
return sum
}
}

致力于分享一系列 Android 系统源码、逆向分析、算法、翻译、Jetpack 源码相关的文章,在技术的道路上一起前进

Android10 源码分析

正在写一系列的 Android 10 源码分析的文章,了解系统源码,不仅有助于分析问题,在面试过程中,对我们也是非常有帮助的,如果你同我一样喜欢研究 Android 源码,可以关注我 GitHub 上的 Android10-Source-Analysis

算法题库的归纳和总结

由于 LeetCode 的题库庞大,每个分类都能筛选出数百道题,由于每个人的精力有限,不可能刷完所有题目,因此我按照经典类型题目去分类、和题目的难易程度去排序。

  • 数据结构: 数组、栈、队列、字符串、链表、树……
  • 算法: 查找算法、搜索算法、位运算、排序、数学、……

每道题目都会用 Java 和 kotlin 去实现,并且每道题目都有解题思路,如果你同我一样喜欢算法、LeetCode,可以关注我 GitHub 上的 LeetCode 题解:Leetcode-Solutions-with-Java-And-Kotlin

精选国外的技术文章

目前正在整理和翻译一系列精选国外的技术文章,不仅仅是翻译,很多优秀的英文技术文章提供了很好思路和方法,每篇文章都会有译者思考部分,对原文的更加深入的解读,可以关注我 GitHub 上的 Technical-Article-Translation

评论

表情 | 预览
Powered By Valine
v1.3.10