代码随想录算法训练营第三十一天| 455.分发饼干、376.摆动序列、53.最大子序和

news2025/2/28 15:38:13

系列文章目录


目录

  • 系列文章目录
  • 455.分发饼干
    • 贪心算法
      • 大饼干喂胃口大的(先遍历胃口)
      • 胃口大的先吃大饼干(先遍历饼干)
      • 小饼干先喂胃口小的(先遍历胃口)
      • 胃口小的先吃小饼干(先遍历饼干)
  • 376. 摆动序列
    • 贪心算法
      • 只关心上下坡摆动,对所有平坡忽略(总体看)[看了其他人的想法,好理解一些]
      • 只关心节点左右的坡度(局部),若两边坡度相反则是峰值,考虑了平坡的情况[自己想不出来]
  • 53. 最大子序和
    • ①暴力解法(双层for循环,超时)
    • ②贪心解法


455.分发饼干

贪心算法

在这里插入图片描述

大饼干喂胃口大的(先遍历胃口)

import java.util.Arrays;
class Solution {
    public int findContentChildren(int[] g, int[] s) {
        //先从小到大自然排序
        Arrays.sort(g);
        Arrays.sort(s);
        int lenG = g.length;
        int rightS = s.length - 1;
        int count = 0;//记录满足的孩子个数
        for (int i = lenG - 1; i >= 0; i--) {//遍历胃口
            if (rightS >= 0 && s[rightS] >= g[i]) {// 遍历饼干(要先判断是否还有饼干再遍历)
                count++;
                rightS--;
            }
        }
        return count;
    }
}

胃口大的先吃大饼干(先遍历饼干)

import java.util.Arrays;
class Solution {
    public int findContentChildren(int[] g, int[] s) {
        //先从小到大自然排序
        Arrays.sort(g);
        Arrays.sort(s);
        int rightG = g.length - 1;
        int count = 0;
        for (int i = s.length - 1; i >= 0; i--) {
            while (rightG >= 0) {
                if (s[i] >= g[rightG]) {
                    count++;
                    rightG--;
                    break;
                }
                rightG--;
            }
        }
        return count;
    }
}

小饼干先喂胃口小的(先遍历胃口)

import java.util.Arrays;
class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int count = 0;
        int leftS = 0;
        for (int i = 0; i < g.length; i++) {
            while (leftS < s.length) {
                if (s[leftS] >= g[i]) {
                    count++;
                    leftS++;
                    break;
                }
                leftS++;
            }
        }
        return count;
    }
}

胃口小的先吃小饼干(先遍历饼干)

import java.util.Arrays;
class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int count = 0;
        int leftG = 0;
        for (int i = 0; i < s.length; i++) {
            if (leftG < g.length &&s[i]>=g[leftG]){
                count++;
                leftG++;
            }
        }
        return count;
    }
}

376. 摆动序列

贪心算法

只关心上下坡摆动,对所有平坡忽略(总体看)[看了其他人的想法,好理解一些]

class Solution {
    int mark = 0;// 记录是否出现摆动,没出现摆动为0,出现摆动后上坡为1,下坡为-1
    int count = 1;//因1 <= nums.length <= 1000,故最少有一个元素

    public int wiggleMaxLength(int[] nums) {
        // nums.length = 1或2的情况可以包含在下面for循环中
        // if (nums.length == 1) return 1; // 不进入for循环,直接返回1
        // if (nums.length == 2) return nums[0] == nums[1] ? 1 : 2; // 有摆动才返回2,否则返回1

        // 策略:只有第一次出现摆动,以及上下坡的转折点的时候,才res++
        for (int i = 1; i < nums.length; i++) {
            int prediff = nums[i] - nums[i - 1];
            // 如果之前都没出现摆动(第一次出现摆动)
            if (mark == 0) {
                if (prediff > 0) {// 第一次出现的摆动为上坡
                    mark = 1;
                    count++;
                }
                if (prediff < 0) {// 第一次出现的摆动为下坡
                    mark = -1;
                    count++;
                }
                //平坡代表没有摆动,不处理
            }

            // 如果遇到上坡,判断上一个摆动是否为下坡,是再记录结果并更新摆动
            if (prediff > 0 && mark == -1) {
                mark = 1;// 记录上坡
                count++;
            }
            // 如果遇到下坡,判断上一个摆动是否为上坡,是再记录结果并更新摆动
            if (prediff < 0 && mark == 1) {
                mark = -1;// 记录下坡
                count++;
            }
            // 注意:此处包含对了平坡的忽略
        }
        return count;
    }
}

只关心节点左右的坡度(局部),若两边坡度相反则是峰值,考虑了平坡的情况[自己想不出来]

class Solution {
    int count = 1;//默认最右面有一个峰值
    int prediff = 0;

    public int wiggleMaxLength(int[] nums) {
        for (int i = 0; i < nums.length - 1; i++) {
            int curdiff = nums[i + 1] - nums[i];//i节点右边坡度
            // 出现峰值
            if (prediff >= 0 && curdiff < 0 || prediff <= 0 && curdiff > 0) {
                count++;
                prediff = curdiff;
            }
        }
        return count;
    }
}

53. 最大子序和

①暴力解法(双层for循环,超时)

第一层 for 就是设置起始位置,第二层 for 循环遍历数组寻找最大值。

class Solution {
    int sum = 0;
    int maxSum = Integer.MIN_VALUE;//将最大和先置为int的最小值

    public int maxSubArray(int[] nums) {

        for (int i = 0; i < nums.length; i++) {
            sum = 0;//每遍历一个节点先将sum置为0
            for (int j = i; j < nums.length; j++) {
                sum += nums[j];
                maxSum = sum > maxSum ? sum : maxSum;
            }
        }
        return maxSum;
    }
}

在这里插入图片描述

②贪心解法

思路:

  1. 局部最优:每遍历一个元素,都记录着截止到当前元素的最大子数组和(当前元素不一定是最大子数组和对应子数组的结尾)。
  2. 全局最优:遍历到最后一个元素,就相当于获得了全局最大子数组和。
    maxSum 要初始化为最小负数,因数组可能全是负数,初始化为0会导致最大和为0
class Solution {
    int sum = 0;
    int maxSum = Integer.MIN_VALUE;//将最大和先置为int的最小值

    public int maxSubArray(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            if (sum > maxSum) maxSum = sum;// 取区间累计的最大值(相当于不断确定最大子序终止位置)
            if (sum <= 0) {
                sum = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和
            }
        }
        return maxSum;
    }
}

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1586572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么在学校很难真正学好嵌入式?

10几年前,我是读电气工程专业,学了很多东西,结构,电机、绘图,plc等等.. 其实,都没什么鸟用,出来还是像个废物。 后面我自学转了单片机开发,说句难听点,自己买个开发板都比在学校学得深。 可能是这个专业的问题,主攻不是嵌入式方向,老师用汇编点个流水灯,这门课就…

第四百五十三回

文章目录 1. 问题描述2. 优化方法2.1 缩小范围2.2 替代方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取AppBar的高度"相关的内容&#xff0c;本章回中将介绍关于MediaQuery的优化.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 问题描述 我们在…

编程新手必看,python中条件控制语句学习(13)

介绍&#xff1a; Python3中的条件控制主要通过if、elif和else关键字来实现&#xff0c;它们用于根据条件执行特定的代码块。 if语句&#xff1a;这是最基本的条件控制结构。如果满足某个条件&#xff08;条件为True&#xff09;&#xff0c;则执行相应的代码块。在Python中&am…

Java学习42-Java 流(Stream)、文件(File)和IO - FileReader\FileWriter的使用

IO流 IO流的概述&#xff0c;分类等 Java程序中&#xff0c;对于数据的输入输出以stream方式进行&#xff0c;可以看作是一种数据的流动。 IO流中的IO是Input和Output的缩写&#xff0c;是非常实用的技术&#xff0c;用于处理设备之间的数据传输。读写文件&#xff0c;网络通…

Linux下批量的批量操作

批量删除docker 镜像 docker images | grep ent-form-web |awk ‘{print $3}’ | xargs docker rmi docker images: 列出所有的docker 镜像 docker images | grep ent-form-web : 选取出结果带 ent-form-web的信息 docker images | grep ent-form-web |awk ‘{print $3}’ 选取…

黑白图像彩色化

黑白图像彩色化 黑白图像彩色化&#xff0c;调用训练好的模型&#xff0c;将图片加上彩色&#xff0c;只需要OPENCV&#xff0c;支持C/PYTHON

【Python函数和类3/6】函数的返回值

目录 知识回顾 目标 函数的返回值 Tips 练习 ​编辑return的其它特性 任意类型的返回值 返回多个值 return的位置 小结 局部变量 局部变量的作用域 全局变量 全局变量的作用域 同名变量 pi的作用域 总结 知识回顾 在上篇博客中&#xff0c;我们学习给函数设置参…

基于 S2-LP 实现 802.15.4g 帧格式的数据透传

1. 引言 S2-LP 硬件上支持 802.15.4g 的帧格式&#xff0c;但是现有的 SDK 包并没有基于该帧格式的示例工程&#xff0c;因此本篇文章将介绍如何实现基于 802.15.4g 帧格式的数据透传。 2. 802.15.4g 帧格式 在开始之前&#xff0c;需要对 802.15.4g 帧格式有一个初步的了解…

VS中使用QT的UI提升类时,找不到头文件的情况

1、情况简述 在使用VS时&#xff0c;会发现与QCreator存在一些差异。最主要的就是要设置很多东西&#xff0c;如果不配置的话&#xff0c;就会遇到一些问题。下面我分享下我调试过程中遇到的一个问题。使用Qdesigner的UI提升类时&#xff0c;找不到头文件的情况&#xff1a; …

Flutter - 环境配置提示 cmdline-tools component is missing

问题&#xff1a; flutter doctor运行命令 flutter doctor 报错&#xff1a; Android toolchain - develop for Android devices (Android SDK version 30.0.2) ✗ cmdline-tools component is missing Run path/to/sdkmanager --install "cmdline-tools;lates…

ChatGPT国内镜像站大全(全都是能白嫖的)

今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像站到处都是&a…

OpenHarmony4.0分布式任务调度浅析

1 概述 OpenHarmony 分布式任务调度是一种基于分布式软总线、分布式数据管理、分布式 Profile 等技术特性的任务调度方式。它通过构建一种统一的分布式服务管理机制&#xff0c;包括服务发现、同步、注册和调用等环节&#xff0c;实现了对跨设备的应用进行远程启动、远程调用、…

ES13:类的新增特性、最外层的await、at...

1-类的新增特性 类私有属性和方法&#xff1a;# class Person{// 不需要传参、一开始就需要初始化的&#xff0c;就可以在类的最外面直接声明这个成员state{a:1,b:2}constructor(name,age){this.namename;this.ageage;}}在属性和方法前加#表示私有 #obj{} #prest(){}静态成员…

DP例题详解(二)最短编辑距离和编辑距离

902. 最短编辑距离 - AcWing题库 #include<bits/stdc.h>using namespace std;const int N1010;int n,m; char a[N],b[N]; int f[N][N];int main() {cin>>n>>a1;cin>>m>>b1;for(int i0;i<m;i)f[0][i]i;for(int i0;i<n;i)f[i][0]i;//先初始化…

Leetcode算法训练日记 | day20

一、合并二叉树 1.题目 Leetcode&#xff1a;第 617 题 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新…

linux中rpm包与deb包的区别及使用

文章目录 1. rpm与deb的区别2. deb软件包的格式和使用2.1 deb软件包命令遵行如下约定2.2 dpkg命令2.3 apt-命令 3. Unix和Linux的区别Reference 1. rpm与deb的区别 有的系统只支持使用rpm包安装&#xff0c;有的只支持deb包安装&#xff0c;混乱安装会导致系统问题。 关于rpm和…

绿联 安装火狐浏览器(Firefox),支持访问路由器

绿联 安装火狐浏览器&#xff08;Firefox&#xff09;&#xff0c;支持访问路由器 1、镜像 linuxserver/firefox:latest 前置条件&#xff1a;动态公网IP。 已知问题&#xff1a; 直接输入中文时&#xff0c;不能完整输入&#xff0c;也可能输入法无法切换到中文&#xff0c;可…

【LeetCode刷题笔记】LeetCode 1365.有多少小于当前数字的数字

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

【STM32G431RBTx】备战蓝桥杯嵌入式→省赛试题→第十四届

文章目录 前言一、题目二、模块初始化三、代码实现interrupt.h:interrupt.c:main.h:main.c: 四、完成效果五、总结 前言 无 一、题目 二、模块初始化 1.LCD这里不用配置&#xff0c;直接使用提供的资源包就行 2.KEY, 四个按键IO口都要配置&#xff0c;分别是PB0, PB1,PB2,PA…

看了下雷军的两份个人简历,的确厉害。。。

最近在网上浏览信息时&#xff0c;偶然看到了雷军的两份简历&#xff0c;一份是详细的工作履历&#xff0c;另一份则是他的干部履历表。 从大学时期开始&#xff0c;雷军就展现出了非凡的才华和毅力。高考成绩惊人&#xff0c;仅仅丢了2分&#xff0c;堪称完美&#xff0c;被武…