算法奇妙屋(四十一)-贪心算法学习之路 8

文章目录

一. 力扣 134. 加油站

1. 题目解析

这里要求从i出发, 最后还要能回到i, 形成回路

2. 算法原理

这道题先写出暴力(枚举)解法, 然后在其基础上进行优化, 即可将时间复杂度降为O(N)

3. 代码

暴力解法(超时)

java 复制代码
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int n = gas.length;
        int[] diff = new int[n];
        for (int i = 0; i < n; i++) {
            diff[i] = gas[i] - cost[i];
        }
        for (int i = 0; i < n; i++) {
            int profit = 0;
            int j = 0;
            for (; j <= n; j++) {
                profit += diff[(i + j) % n];
                if (profit < 0) {
                    break;
                }
            }
            if (profit >= 0) {
                return i;
            }
        }
        return -1;
    }
}

贪心优化

java 复制代码
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int n = gas.length;
        int[] diff = new int[n];
        for (int i = 0; i < n; i++) {
            diff[i] = gas[i] - cost[i];
        }
        for (int i = 0; i < n; i++) {
            int profit = 0;
            int j = 0;
            for (; j <= n; j++) {
                profit += diff[(i + j) % n];
                if (profit < 0) {
                    break;
                }
            }
            if (profit >= 0) {
                return i;
            }
            i = i + j; // 优化
        }
        return -1;
    }
}

二. 力扣 738. 单调递增的数字

1. 题目解析

这道题的暴力解法很好想出来, 从当前数开始逐次递减, 直到每个位置都呈现递增即可

2. 算法原理

暴力解法是将数字变为字符串, 通过比较每个位置的字符即可, 这里图解只画出贪心解法

3. 代码

暴力解法代码(超时)

java 复制代码
class Solution {
    public int monotoneIncreasingDigits(int n) {
        while (n > 9) {
            StringBuilder s = new StringBuilder();
            s.append(n);
            int i = 1;
            for (; i < s.length(); i++) {
                if (s.charAt(i) < s.charAt(i - 1)) break;
            }
            if (i == s.length()) {
                return n;
            }
            n--;
        }
        return n;
    }
}

贪心解法代码

java 复制代码
class Solution {
    public int monotoneIncreasingDigits(int n) {
        StringBuilder s = new StringBuilder();
        s.append(n);
        int len = s.length();
        int i = 0;
        // 找最右面呈递减趋势的位置
        for (; i < len - 1; i++) {
            if (s.charAt(i) > s.charAt(i + 1)) break;
        }
        if (i == len - 1) {
            return n;
        }
        // 找最左边相同的数字位置
        char ch = s.charAt(i);
        int j = i;
        for (; j > 0; j--) {
            if (s.charAt(j - 1) != ch) break;
        }
        s.replace(j, j + 1, String.valueOf((char)(ch - 1)));
        // 该位置之后都变为9
        for (int k = j + 1; k < len; k++) {
            s.replace(k, k + 1, String.valueOf(9));
        }
        return Integer.valueOf(s.toString());
    }
}
相关推荐
小羊没烦恼!5 分钟前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
wanderist.12 分钟前
202609CSP认证P3
算法
云淡风轻~窗明几净1 小时前
角谷猜想最接近严格证明的测试 Version1.1.1
人工智能·算法·机器学习·图论
机器学习之心1 小时前
PINN × SVM × NSGA-II × 熵权TOPSIS:一套跑通「建模—优化—决策」的多目标优化框架
算法·机器学习·支持向量机
别动我齐刘海2 小时前
机器人 C++ / 系统联调补强2——异常处理、Protobuf
linux·c++·人工智能·学习·算法·机器学习·机器人
一直C2 小时前
嵌入式 Linux 驱动开发学习笔记:内核定时器、platform 总线与 I²C 驱动
linux·驱动开发·嵌入式硬件·学习·imx6ull
荆棘鸟智能2 小时前
短历时洪水预报算法实践:水文模型与 LightGBM 残差订正融合
人工智能·算法·机器人
承渊政道3 小时前
Linux网络学习【传输层协议UDP】
linux·网络·网络协议·学习·ubuntu·udp
andrsted3 小时前
练题簿免费刷题小程序:和学习搭子共用一份题库,一起刷题复习
学习·面试·微信小程序·小程序·学习方法·刷题
葫三生3 小时前
关于三生原理系列被技术开发社区批量收录或引发策展边界讨论的一种思考
大数据·人工智能·深度学习·算法·机器学习·数据挖掘·开源