数学在算法中的重要性,写给初学算法的朋友

刚做了道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年老程序员基础真的是捉襟见肘啊!

数学在算法中的重要性,写给初学算法的朋友_第1张图片

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)。

数学的重要性毋庸置疑了,学海无涯!

与君共勉。

你可能感兴趣的:(后端,算法,JAVA,算法,leetcode,职场和发展)