刚做了道leetcode的简单题,题目要求如下:
现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满
2
杯 不同 类型的水或者1
杯任意类型的水。给你一个下标从 0 开始、长度为
3
的整数数组amount
,其中amount[0]
、amount[1]
和amount[2]
分别表示需要装满冷水、温水和热水的杯子数量。返回装满所有杯子所需的 最少 秒数。
我拿出一张纸一划拉,发现了规律:先将给定的数组排序(从小到大),如果amount数组中最大和二大的两个值不为0,就同时扣减,如果二大为零,则表示最小的已经为零,此时只需扣减最大的直至为零,无论何种扣减都要将时间的变量增一。
于是迅速的写出了代码,运行,提交,完美获得了今天的10积分。
内心甚至有那么点小窃喜。
class Solution {
public int fillCups(int[] amount) {
int seconds = 0;
int[] newAmount = {};
if(amount[0] == 0 && amount[1] == 0 && amount[2] == 0){
return 0;
}
do {
newAmount = sortAmount(amount);
if (newAmount[1] == 0) {
newAmount[2]--;
}
else {
newAmount[2]--;
newAmount[1]--;
}
seconds++;
} while (newAmount[0] != 0 || newAmount[1] != 0 || newAmount[2] != 0);
return seconds;
}
public static int[] sortAmount(int[] amount) {
Arrays.sort(amount);
return amount;
}
}
窃喜之余“手贱”点了官解看了下;
官方的做法是贪心+分类,我一看标题甚至有些不耐烦,心想:哪有这么烦?
看完整个题解,内心彻底瓦解:作为一个10年老程序员基础真的是捉襟见肘啊!
class Solution {
public int fillCups(int[] amount) {
Arrays.sort(amount);
if (amount[2] > amount[1] + amount[0]) {
return amount[2];
}
return (amount[0] + amount[1] + amount[2] + 1) / 2;
}
}
官解可谓一剑封喉,我彻底的倒下了!最主要的是时间复杂度只为 O(1)。
数学的重要性毋庸置疑了,学海无涯!
与君共勉。