leetcode贪心算法总结

薛定谔虚拟筛选实战:如何用PDB文件快速构建受体格点(避坑指南) 本文提供了薛定谔虚拟筛选实战指南,聚焦于如何从PDB文件快速、精准地构建受体格点。文章详细解析了可变残基的理性处理策略、基于配体尺寸的盒子量化设置方法,并分享了高级约束与排除体积的实战技巧,旨在帮助用户避开常见陷阱,提升虚拟筛选的成功率与效率。 阅读详情


在这里插入图片描述

一、入门

T455. 分发饼干

在这里插入图片描述

//小饼干给小胃口
class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int count = 0;
        int start = 0;
        for(int i = 0;i<s.length&&start<g.length;i++){
            if(s[i]>=g[start]){
                start++;
                count++;
            }
        }
        return count;
    }
}

二、中等

1. 序列问题

376. 摆动序列

在这里插入图片描述

class Solution {
    //删除单调坡上的节点
    public int wiggleMaxLength(int[] nums) {
        if (nums.length == 1){return 1;}
        //记录差值
        int pre = 0; 
        int cur = 0;
        int count = 1;
        for(int i = 1;i<nums.length;i++){
            cur = nums[i] - nums[i-1];
            if ((cur>0&&pre<=0)|| (cur<0&&pre>=0)){//pre需要取等号
                count++;
                pre = cur;
            }
        }
        return count;
    }
}

2. 两个维度权衡问题

T406. 根据身高重建队列

在这里插入图片描述

class Solution {
    //优先按身高高的people的k来插入 插入操作后的people满足队列属性
    //二维分开处理
    //先对身高排序 高的在前 若相同就看k k小的在前面
    //再根据k插入
    public int[][] reconstructQueue(int[][] people) {
        //lambda表达式实现对二维数组的某一维排序

        Arrays.sort(people,(x,y)->{
            if(x[0] == y[0]){return x[1] - y[1];}
            return y[0] - x[0];
        });

        LinkedList<int[]> que = new LinkedList<>();
        for(int[] p:people){
            que.add(p[1],p);
        }

        return que.toArray(new int[people.length][2]);

    }
}

3. 股票问题

三、进阶

T53. 最大子数组和(dp或者贪心)

在这里插入图片描述

class Solution {
    //局部最优:出现负数就重新开始
    public int maxSubArray(int[] nums) {
        if(nums.length == 1){return nums[0];}
        int sum = Integer.MIN_VALUE;
        int count = 0;
        for(int i = 0;i<nums.length;i++){
            count = count + nums[i];
            sum = Math.max(count,sum);
            if(count<0){
                count=0;//出现负数 重新开始取数
            }
        }
        return sum;
    }
}

T134. 加油站

在这里插入图片描述

  • 思路分析
    总的耗油量必须大于0;
    如果出现求和小于0,那么必然不是起点
class Solution {
//局部最优:当前累加rest[j]的和curSum一旦小于0,起始位置至少要是j+1,因为从j开始一定不行
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int rest = 0;
        int sum = 0;
        int index = 0;
        for(int i = 0;i<gas.length;i++){
            rest += gas[i] - cost[i];
            sum += gas[i] - cost[i];//加的油和消耗的油之差
            if(rest<0){
                rest = 0;
                index = i + 1;
            }
        }
        if(sum<0){return -1;}//此时必然不可能跑一周
        return index;
    }
}

T968. 监控二叉树

在这里插入图片描述

  • 思路分析
    从下往上看,局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少!
    每个节点可能有3种状态:
    该节点无覆盖
    本节点有摄像头
    本节点有覆盖
  • 代码实现
 //局部最优:让叶子节点的父节点放摄像头
 //后序遍历:左右中
 //传递进去的root节点需要由左右节点的状态来决定如何处理
 //状态0:安装了监控;1:可以观察到,但没监控;2:观察不到
class Solution {
    int sum = 0;
    public int minCameraCover(TreeNode root) {
        if(root == null){return 0;}
        if(minHelper(root) == 2){sum++;}//如果根节点没装监控 需要加1
        return sum;
    }
    public int minHelper(TreeNode root){
        //终止条件
        if(root == null){
            return 1;
        }
        //计算左右节点的状态
        int left = minHelper(root.left);
        int right = minHelper(root.right);
        //分情况处理root
        if (left == 2 || right == 2){ //两个左右孩子有一个观察不到
            sum++;
            return 0;
        }else if(left == 1 && right == 1){//左右孩子观察得到 但是没装
            return 2;
        }else{
            return 1;
        }
    }
}

0. 区间问题

T55. 跳跃游戏 (能否到达)

在这里插入图片描述

class Solution {
    //不管跳多少步 只要能覆盖到最后一层就好
    public boolean canJump(int[] nums) {
        if(nums.length == 1){return true;}
        int cover = 0;
        for(int i = 0;i<=cover;i++){ //当i超出cover范围后就无法跳跃了
            cover = Math.max(cover,i+nums[i]);
            if(cover>=nums.length-1){
                return true;
            }
        }
        return false;
    }
}

T45. 跳跃游戏Ⅱ ****

在这里插入图片描述

  • 思路分析
    如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。
  • 可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新。
    如果从这个 起跳点 起跳叫做第 1 次 跳跃,那么从后面 3 个格子起跳 都 可以叫做第 2 次 跳跃。
    所以,当一次 跳跃 结束时,从下一个格子开始,到现在 能跳到最远的距离,都 是下一次 跳跃 的 起跳点。
  • 对每一次 跳跃 用 for 循环来模拟。
  • 跳完一次之后,更新下一次 起跳点 的范围。
  • 在新的范围内跳,更新 能跳到最远的距离。
    记录 跳跃 次数,如果跳到了终点,就得到了结果。
    在这里插入图片描述
  • 代码实现
class Solution {
    public int jump(int[] nums) {
        if(nums.length == 1) return 0;
        int start = 0;//每一次跳跃的起点
        int cover = nums[0];//最大覆盖范围,也是每次跳跃的终点
        int step = 1;//记录步数,
        while(cover < nums.length-1){//覆盖没有到达终点,一次while循环是一次跳跃
            int tempStart = start;
            int tempEnd = cover;
            for(int i=tempStart;i<=tempEnd;i++){
                if(i+nums[i]>cover){
                    cover = i+nums[i];
                    start = i + 1;
                }
            }
            step++;
        }
        return step;
    }
}

T452. 用最少数量的箭引爆气球

在这里插入图片描述

class Solution {
    //局部最优:重叠在一起
    //左边从小到大排序,更新右边界
    public int findMinArrowShots(int[][] points) {
        int count = 1;
        Arrays.sort(points,(a,b)->{
            return Integer.compare(a[0]-b[0]);
        });
        for(int i=1;i<points.length;i++){
            if(points[i][0]>points[i-1][1]){
                count++;//无重叠计数加1
            }
            else{
                points[i][1] = Math.min(points[i][1],points[i-1][1]);//更新右边界
            }
        }
        return count;
    }
}

T435. 无重叠区间

在这里插入图片描述
思路分析:
排序(左边界从小到大),出现重叠就更新右边界

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        int count=0;//记录重复的区间
        //排序:按第一个元素 升序排列
        Arrays.sort(intervals,(x,y)->{
            return x[0]-y[0];
        });
        for(int i=1;i<intervals.length;i++){
            if(intervals[i-1][1]>intervals[i][0]){//前一个的右边界大于当前的左边界.出现重复了
                count++;
                intervals[i][1] = Math.min(intervals[i-1][1],intervals[i][1]);//更新右边界
            }

        }
        return count;
    }
}

T763. 划分字母区间

在这里插入图片描述

class Solution {
    //找最大值切割
    //画图分析
    public List<Integer> partitionLabels(String s) {
        int[] sList = new int[26];
        char[] ch = s.toCharArray();
        List<Integer> res = new ArrayList<>();
        for(int i = 0;i<ch.length;i++){
            sList[ch[i]-'a'] = i;
        }
        int last = -1;//记录最后一个索引,求长度可用
        int maxIdx = 0;//记录最大边界
        for(int i = 0;i<ch.length;i++){
            maxIdx = Math.max(maxIdx,sList[ch[i]-'a']);//记录最大值
            if (i == maxIdx){ 
                res.add(i-last);
                last=i;
            }
        }
        return res;
    }   
}

T56. 合并区间

在这里插入图片描述

class Solution {
    //i-1的右边界大于i的左边界就进行合并
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));
        LinkedList<int[]> res = new LinkedList<>();//选择linkedLIST
        res.add(intervals[0]);//存放当前区间,遍历的时候进行比较
        for(int i = 1;i<intervals.length;i++){
            if(intervals[i][0]<=res.getLast()[1]){//右边界小于等于左边界
                int left = res.getLast()[0];
                int right = Math.max(intervals[i][1],res.getLast()[1]);
                res.removeLast();
                res.add(new int[]{left,right});//更新左右边界
            }else{
                res.add(intervals[i]);//直接加入结果
            }
        }
        return res.toArray(new int[res.size()][]);//linkedlist变成二维array
    }
}
【AI大模型:架构实战】31、工业级AI大模型系统全景解析:从架构设计到提示语引擎实践 本文系统解析了工业级AI大模型的核心架构与技术体系。整体采用分层解耦设计,包含数据工程、模型训练、模型部署、应用集成和监控运维五大核心模块,以及分布式计算、高速网络、异构硬件三大支撑体系。数据工程构建高质量数据处理流水线;模型训练实现从预训练到业务适配的全流程;模型部署优化服务性能与可用性;应用集成连接业务场景;监控运维保障系统持续优化。三大支撑能力专注于千亿参数管理、高并发低延迟处理和持续学习进化。该架构设计既满足当前需求,又为技术演进预留空间,为企业在数字化转型中提供AI工业化落地的完整解决方案。 阅读详情

相关推荐

[VisionPro] CogPMAlignTool 工具详解

[VisionPro] [CogPMAlignTool] [模板匹配]

weixin_43163656的博客 1万+

LeetCode-双指针

记录,整理LeetCode中与“双指针”相关的题目

a445673440的博客 351

【Photoshop JSX脚本】强大的事件监听器脚本 - event_listener.jsx

新手第一次了解的事件监听一定是ScriptingListener.8bi插件,如果你对此插件有了基本运用,那么现在了解一款更方便的时间监听脚本event_listener.jsx。不再像ScriptingListener.8bi插件那样晦涩难懂。 1、准备event_listener.jsx文件到 F:\Program Files\Adobe Photoshop 2020\Presets\...

Greless的后花园 8205

分布式定时调度技术解析与实践指南

定时调度作为自动化任务执行的核心技术,通过预定义时间规则实现系统作业的精准触发。其底层原理依赖CRON表达式解析、任务队列管理及分布式协调机制,在提升运维效率的同时确保业务连续性。典型技术实现包括Spring Task的单机调度、XXL-JOB的集中式调度以及阿里云SchedulerX的云原生方案,其中分布式锁和任务分片技术解决了集群环境下的幂等性与并行处理难题。在电商订单处理、数据备份等场景中,结合失败重试机制与动态分片策略,可使任务吞吐量提升60%以上。随着云原生架构普及,支持Kubernetes调度的

weixin_33690367的博客 368

(实战)[re:Invent 2018]-001:赛道分析-(致敬1024)

打印log

Rainbow 2778

手把手教你用EG2153搭建开关电源:SOP-8封装驱动芯片的5个设计技巧

本文详细介绍了使用EG2153自振荡半桥驱动芯片搭建开关电源的五个核心设计技巧。内容涵盖从深入理解芯片工作机制、频率编程计算误区、SOP-8封装的热管理方案,到死区时间评估与外部保护电路设计,以及实战调试与故障排查指南,旨在帮助工程师实现稳定可靠的小功率电源设计。

weixin_29200485的博客 377

Java多线程-二

这一篇主要介绍了volatile关键字的基本用法,使用场景等等。在讲述volatile之前,还得补充一些预备知识,比如Java内存模型,并发编程中常见的问题。这些应该如何解决,volatile会解决哪些问题,如何解决等等。

a445673440的博客 326

深空探测处理软件USGS-ISIS的下载安装

深空探测处理软件USGS-ISIS下载安装教程

qq_31721595的博客 3310

LeetCode-动态规划

记录,整理LeetCode中与“动态规划”相关的题目

a445673440的博客 1008

CPU进程调度算法【FCFS、SJF、优先级、RR、多级队列、多级反馈队列调度】

目录 一、先到先服务调度: 二、最短作业优先调度: 三、优先级调度: 四、轮转调度: 五、多级队列调度: 六、多级反馈队列调度: CPU调度算法处理的问题是:从就绪队列中选择进程以便为其分配CPU。 一、先到先服务调度: First Come,First Served(FCFS) 定义:先请求CPU的进程首先分配到CPU。FCFS策略可以通过FIFO队列轻松实现。 护航效果:其他所有进程会等待一个大进程释放CPU 非抢占式:一旦CPU分配给了一个进程,该进程就会使用CPU知道释.

马小超 3921

14、利用Helm和GitOps实现Kubernetes资源管理与CI/CD流程优化

本文介绍了如何结合Helm、GitOps和Terraform等工具,优化Kubernetes资源管理和CI/CD流程。内容涵盖了Helm提供程序的配置、GitOps的核心理念、CI/CD管道的构建与测试策略、GitHub源代码管理模型以及流程优化建议,旨在提升软件开发和部署的效率与质量。

y7z8a9的博客 154

HashMap源码阅读

在准备面试的过程中,发现HashMap源码是很常见的考点,于是进行了仔细的学习。具体内容包括,HashMap的构造方法,put,get方法,以及put&get所需要的hash方法,还有扩容时所需要的resize方法。

a445673440的博客 615

CS之攻击菜单详解-后门生成与上线

能够生成如HTA文档、office宏、payload生成器、exe程序。 windows可执行程序exe 可以看到能生成两种windows可执行程序,其分别代表stage分阶段和unstage(stageless)不分阶段。传送门 ——>Cobalt Strike中payload的stage与unstage区别 选择监听器后,按需生成不同类型的exe 然后在目标机器运行即可上线 payload生成器 选择生成如下类型的后门 ——>https://che...

渗透之路,攻防之间皆学问 6805

力扣LeetCode-贪心算法

贪心算法 基本知识 1.思想 基于局部最优的选择逐渐推导出全局最优解 2.一般步骤 将问题分解为若干个子问题; 找出合适的贪心策略; 求解每一个子问题的最优解; 将局部最优解合成为全局最优解; 典型例题 1. LeetCode 376. 摆动序列 题目 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如, [1, 7, 4, 9

weixin_56005963的博客 2981

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

最详细,最简单的力扣(leetcode)hot 100贪心算法讲解

本文给大家带来了最清晰,最容易理解的力扣 hot100算法题的解决方法。保证看了都能够学会。

yyyCode的博客 2393

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++力扣Leetcode算法1--贪心算法

看的书自学 《高畅Leetcode刷题》 过程很痛苦 不建议学习 不会的地方没有解答之处 到处查找很困扰 浪费时间错误的地方欢迎大家相互交流 能改正最好啦 蟹蟹贪心算法就是啥都想要,从局部最优解达到全局最优解,前提,局部最优解结果互不干扰做题时可以考虑遍历,选择,排序以下试题用到的头文件和命名空间。

m0_62037584的博客 1004

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

力扣100题——贪心算法

每次做贪心都觉得自己智商低。

MogulNemenis的博客 2646

leetcode/力扣 贪心算法总结,代码随想录PDF下载

依旧保持「代码随想录」严谨缜密的风格,这是全网最全最详细的贪心算法专题讲解!

代码随想录 7285

二刷力扣——贪心算法

解决方法:得先满足胃口小的孩子,所以得排序;要用双指针的办法的话,指针一直往前走,g不排序不行,比如:g=3,2,1;所以都排序,遇到可满足的就count++,i++;遇到不可满足的就看下一块饼干:j++。,所以大家了解贪心算法 就了解它没有规律的本质就够了。如果每步最优解不能保证到达全局最优,就不能用。贪心算法其实就是没有什么规律可言。

weixin_45706374的博客 1434

leetcode 376. 摆动序列 ——贪心算法

376. 摆动序列 题目来源:力扣(LeetCode) https://leetcode-cn.com/problems/wiggle-subsequence/ 解题思路: 依次遍历数组中的每一个元素,判断当前元素差值 nums[i]-nums[i-1] 与上一个元素差值 nums[i-1]-nums[i-2] 是否异号,是,则摆动子序列长度加1,并且保存当前元素差值用于与下一个元素差值比较;否,则直接跳过,遍历下一个元素。 即使用贪心算法,只要碰到两次差值异号就将摆动子序列的长度加1。 代码: publi

longool的博客 556

【算法刷题】贪心算法,快速排序(LeetCode力扣)

本篇博客对:贪心算法进行了详细的介绍,分享了两种求解最大公因数的算法代码,LeetCode水题,ACM入门题作为索引,借助实际代码,对上面介绍的两种快速排序函数进行初级应用,粗略地介绍了贪心算法的实现和两种解题方法。

m0_63499399的博客 615

leetcode(力扣)刷题1——贪心算法

分发饼干leetcode455 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 示例 1: 输入: g = [1,2,3], s = [1,1] 输出: 1 解释: 你有三个孩子和两块

m0_49003264的博客 449

力扣刷题指南——贪心算法

一、什么是贪心算法

JJJasmine的H君的博客 2333

Leetcode贪心算法合集

力扣贪心算法合集(C++)

qq_43523544的博客 1091

【leetcode题解】贪心算法

在考虑最长递增子序列的“长度”的时候,不需要关心这个序列是什么样子,仅需关心“最后一个元素”是谁。解法一:动态规划 - 利用dp找到数组中最长递增子序列的长度,判断是否大于等于3即可。1. 前期学习的时候,把重点放在贪心的策略上,把这个策略当成经验吸收。本题的排序(优化):把数转化成字符串,然后拼接字符串,比较字典序。正常的排序本质(升序):确定元素的先后顺序,谁在前,谁在后。解法一:暴力解法->递归->记忆化搜索->动态规划(麻烦)净收益:diff = [-2,-2,-2,3,3]

2301_80802299的博客 1229

贪心算法-860.柠檬水找零-力扣(LeetCode)

当20,10的时候,用了下面种补钱方式,10元就无法补钱,所以优先使用10+5的补钱方式,其次是5+5+5的补钱方式,如果两种都不满足,则返回false。我们需要注意我们是没有初始零钱的,所以当第一个顾客支付10或20时,无法找零此时返回false。当顾客支付20元时,我们有两种补钱方式(这里就用到了贪心),一种是10+5,另一种是5+5+5.当顾客支付10元时,我们要先判断是否有零钱补,如果没有则返回false,有则补5元。首先对于顾客支付的钱共有三种,5,10,20,我们需要对其分别讨论。

black_bear_white的博客 1112
上一篇: leetcode栈与队列刷题总结
下一篇: Leetcode差分数组、前缀和刷题总结
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值