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

文章目录

一. 力扣 860. 柠檬水找零

1. 题目解析

1. 题目翻译成人话就是: 每名顾客只能按bills顺序买你的柠檬水, 给的钱数也是按顺序, 柠檬水固定5元, 要求就是给每名顾客都能正确找零
2. 注意点①: 一开始你没有任何钱, 所以如果顾客一上来给的不是5元的面额, 直接返回false
3. 注意点②: 先考虑当前顾客能否正常找零, 不能的话直接返回false, 不继续考虑后面
4. 注意点③: 顾客给你的面额只有三种, 5, 10, 20

2. 算法原理

3. 代码

java 复制代码
class Solution {
    int[] change;
    public boolean lemonadeChange(int[] bills) {
        if (bills[0] != 5) {
            return false;
        }
        change = new int[2];
        for (int i = 0; i < bills.length; i++) {
            if (bills[i] == 5) {
                change[0]++;
            }else if (bills[i] == 10) {
                if (change[0] != 0) {
                    change[0]--;
                    change[1]++;
                }else {
                    return false;
                }
            }else {
                if (change[0] != 0 && change[1] != 0) {
                    change[0]--;
                    change[1]--;
                }else if (change[0] >= 3) {
                    change[0] -= 3;
                }else {
                    return false;
                }
            }
        }
        return true;
    }
}

二. 力扣 2208. 将数组和减半的最少操作次数

1. 题目解析

这道题的题意就是题目, 这里图解简单重复下过程

2. 算法原理

根据题目解析我们可以发现两个关键点:
1. 我们每次都需要找到最大值, 用最大值➗️2, 这样就可以让总和减少的最多
2. 使用大根堆, 将所有元素丢入堆中, 每次取出堆顶元素(最大值)

3. 代码

java 复制代码
class Solution {
    public int halveArray(int[] nums) {
        PriorityQueue<Double> q = new PriorityQueue<>((a, b) -> b.compareTo(a));
        double sum = 0;
        for (int x : nums) {
            sum += x;
            q.offer((double)x);
        }
        int ret = 0;
        sum /= 2.0;
        while (sum > 0) {
            double t = q.poll() / 2.0;
            sum -= t;
            q.offer(t);
            ret++;
        }
        return ret;
    }
}

三. 力扣 179. 最大数

1. 题目解析

**结合示例这道题很好理解, 返回拼接的最大整数的字符串形式

**

2. 算法原理

做这道题, 我们可以通过类比数据结构5-七大基于比较的常见排序算法中的排序算法, 先确立排序规则, 将数组中的元素排好序👇
1. 排序规则: 假设数组nums = a, b, c
① 将最近的两个数a 与 b, 进行拼接, 组成ab与ba
② ab > ba, a就排在前面, b排在后面
③ 反之, b在前, a在后, 之后以此类推进行排序
2. 注意点:
① 当最后的结果nums的第一个元素为0时, 意味着给定的所有元素都是0, 所以直接返回字符串 "0" 即可
② 进行拼接并比较时, 我们可以先将整个nums转化为字符串数组, 再拼接比较每个位置的字典序即可

3. 代码

java 复制代码
class Solution {
    public String largestNumber(int[] nums) {
        int n = nums.length;
        // 将nums都变为字符串
        String[] s = new String[n];
        for (int i = 0; i < n; i++) {
            s[i] = "" + nums[i];
        }
        // 排序
        Arrays.sort(s, (a, b) -> {
            return (b + a).compareTo((a + b));
        });
        StringBuilder ret = new StringBuilder();
        for (String str : s) {
            ret.append(str);
        }
        if (ret.charAt(0) == '0') return "0";
        return ret.toString();
    }   
}
相关推荐
程序猿小泓3 小时前
从 Claude Code 学 Agent Harness:一个前端工程师的 AI Agent 学习笔记
前端·人工智能·学习
旖-旎3 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
变量未定义~3 小时前
单调栈+倍增思想 皇家守卫【算法赛】、单调队列 附近最小
算法
QN1幻化引擎3 小时前
给 AI 做一次「意识体检」——基于 QN1 幻化引擎的灵鉴意识识别框架与 DalinX V5 实测
大数据·数据结构·人工智能·算法·架构
拂拉氏4 小时前
【知识讲解】 AVL树从基本成员的介绍到核心接口的实现(插入、判断、删除等等)
数据结构·算法·avl树
换个昵称24 小时前
大模型学习8下-高性能推理引擎vLLM学习笔记
笔记·学习·vllm
可靠的仙人掌5 小时前
SAC(Soft Actor-Critic)算法底座
开发语言·算法·php
报错小能手5 小时前
OpenTenBase学习——集群编译&部署
学习
渣渣灰飞5 小时前
MySQL 系统学习 第二阶段 第四章:DCL(Data Control Language)第二节:权限管理与角色(Role)
数据库·学习·mysql
霸道流氓气质6 小时前
Java 工程师 AI 智能体(Agent)完整学习路线
java·人工智能·学习