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

18 篇文章 0 订阅
4 篇文章 0 订阅

刚做了道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)。

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

与君共勉。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值