leetcode刷题day27|贪心算法Part01(455.分发饼干、376. 摆动序列、53. 最大子序和)

ops/2024/10/22 13:36:10/

前言: 贪心的本质选择每一阶段的局部最优,从而达到全局最优。

455.分发饼干

思路:局部最优-大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个;全局最优:喂饱尽可能多的小孩。可以尝试使用贪心策略,先将饼干数组和小孩数组排序,然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。具体实现使用两个指针分别指向两个数组,最大的饼干能满足胃口最大的小孩,小孩数量加一,两个指针同时前移,如果最大的饼干不能满足,则小孩指针前移,继续判断。

代码如下:

class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int sNum=s.length-1;int child=0;for(int i=g.length-1;i>=0;i--){if(sNum>=0 && g[i]<=s[sNum]){child++;sNum--;}}return child;}
}

注意:如果是想先喂饱大胃口的小孩,for循环只能是胃口,用下标控制饼干,这样才能满足条件时才移动饼干。

376. 摆动序列

思路:
局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。
整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列。
实际操作可以不做删除操作,题目要求最长摆动子序列的长度,只需要统计数组的峰值数量即可。

考虑三种特殊情况:
情况一:上下坡中有平坡:这个时候需要考虑保留平坡左端点还是右端点,如果保留左端点即允许prediff==0。
情况二:数组首尾两端:只有两个元素时,result 初始为 1(默认最右面有一个峰值),此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2)
情况三:单调坡中有平坡:设置只有在峰值处将curDiff 赋值给preDiff。

代码如下:

class Solution {public int wiggleMaxLength(int[] nums) {int result=1;int preDiff=0;int curDiff=0;for(int i=1;i<nums.length;i++){curDiff=nums[i]-nums[i-1];if((preDiff<=0 && curDiff>0 )||(preDiff>=0 && curDiff<0)){result++;preDiff=curDiff;}}return result;}
}

53. 最大子序和

思路:局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。
全局最优:选取最大“连续和”

代码如下:

class Solution {public int maxSubArray(int[] nums) {int result=Integer.MIN_VALUE;int sum=0;for(int i=0;i<nums.length;i++){sum+=nums[i];result=Math.max(result,sum);if(sum<=0){sum=0;}}return result;}
}

注意只有负数的情况。

总结:目前来看贪心算法的代码并不难,但是难在想到什么是局部最优?怎么达到局部最优?


http://www.ppmy.cn/ops/118960.html

相关文章

图解C#高级教程(一):委托

什么是委托 可以认为委托是持有一个或多个方法的对象。但它与对象不同&#xff0c;因为委托可以被执行。当执行委托时&#xff0c;委托会执行它所“持有”的方法。先看一个完整的使用示例。 // See https://aka.ms/new-console-template for more informationdelegate void M…

Python与SQL Server数据库结合导出Excel并做部分修改

Python与SQL Server数据库结合导出Excel并做部分修改 需求&#xff1a;在数据库中提取需要的字段内容&#xff1b;并根据字段内容来提取与拆分数据做为新的列最后导出到Excel文件 # -*- coding: utf-8 -*- import pandas as pd import re import pymssql import timestart_ti…

GAMES101(作业8)

作业8 题目&#xff1a; 模拟绳子动画&#xff0c;包括基于物理的&#xff0c;和非物理的&#xff0c;应该修改的函数是:rope.cpp 中的void Rope::simulateEuler(... Rope::rope(...)&#xff0c;&#xff0c;void Rope::simulateVerlet(...) 代码框架&#xff1a; main:负…

UnityHub下载任意版本的Unity包

1)先打开 // 也可以采用2直接打开 2)也可以直接打开 下载存档 (unity.com) 3)关联起来UnityHub即可

雷池 WAF 如何配置才能正确获取到源 IP

经常有大哥反馈说雷池攻击日志里显示的 IP 有问题。 这里我来讲一下为什么一些情况下雷池显示的攻击 IP 会有问题。 问题说明 默认情况下&#xff0c;雷池会通过 HTTP 连接的 Socket 套接字读取客户端 IP。在雷池作为最外层网管设备的时候这没有问题&#xff0c;雷池获取到的…

Android常用C++特性之std::make_unique

声明&#xff1a;本文内容生成自ChatGPT&#xff0c;目的是为方便大家了解学习作为引用到作者的其他文章中。 std::make_unique 是 C14 引入的一个函数模板&#xff0c;用于创建类型为 std::unique_ptr 的智能指针。智能指针用于管理动态分配的对象&#xff0c;在其生命周期结束…

PHP程序如何实现限制一台电脑登录?

PHP程序如何实现限制一台电脑登录&#xff1f; 可以使用以下几种方法&#xff1a; 1. IP地址限制&#xff1a;在PHP中&#xff0c;可以通过获取客户端的IP地址&#xff0c;然后与允许登录的IP地址列表进行比对。如果客户端的IP地址不在列表中&#xff0c;就禁止登录。 “php $…

Qt 文件操作

目录 Qt 文件操作1. I/O设备1.1 I/O设备的类型1.2 打开模式 2. 文件读写2.1 QFile打开文件写文件读文件静态函数 2.2 StreamQTextStreamQDataStream 2.3 QFileInfo 3. 配置文件3.1 QSettings基本用法设置和获取值配置文件格式常用函数分组操作 3.2 QJsonDocument主要功能解析 J…