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

系列文章目录


目录

  • 系列文章目录
  • 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;
    }
}

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Claude使用教程

claude 3 opus面世后&#xff0c;网上盛传吊打了GPT-4。网上这几天也已经有了许多应用&#xff0c;但竟然还有很多小伙伴不知道国内怎么用gpt&#xff0c;也不知道怎么去用这个据说已经吊打了gpt-4的claude3。 今天我们想要进行的一项尝试就是—— 用claude3和gpt4&#xff0c…

2024-04-11最新dubbo+zookeeper下载安装,DEMO展示

dubbozookeeper下载安装 下载zookeeper&#xff1a; 下载地址 解压&#xff0c;并进入bin目录&#xff0c;启动 如果闪退可以编辑脚本&#xff0c;在指定位置加上暂停脚本 报错内容说没有conf/zoo.cfg&#xff0c;就复制zoo_sample.cfg重命名为zoo.cfg 再次启动脚本&#x…

HarmonyOS开发实例:【手势截屏】

介绍 本篇Codelab基于手势处理和截屏能力&#xff0c;介绍了手势截屏的实现过程。样例主要包括以下功能&#xff1a; 根据下滑手势调用全屏截图功能。全屏截图&#xff0c;同时右下角有弹窗提示截图成功。根据双击手势调用区域截图功能。区域截图&#xff0c;通过调整选择框大…

Excel 记录单 快速录入数据

一. 调出记录单 ⏹记录单功能默认是隐藏的&#xff0c;通过如下如图所示的方式&#xff0c;将记录单功能显示出来。 二. 录入数据 ⏹先在表格中录入一行数据&#xff0c;给记录单一个参考 ⏹将光标至于表格右上角&#xff0c;然后点击记录单按钮&#xff0c;调出记录单 然后点…

百元不入耳运动耳机哪个品牌好?五款业内顶尖品牌推荐

在追求舒适与健康的运动中&#xff0c;不入耳式&#xff08;开放式耳机&#xff09;运动耳机逐渐成为了许多运动爱好者的首选&#xff0c;它们不仅避免了长时间佩戴耳机带来的不适&#xff0c;还能在享受音乐的同时保持对环境的警觉&#xff0c;确保运动安全&#xff0c;市场上…

Python中同时调用多个列表

如果你有多个列表&#xff0c;想要同时迭代它们&#xff0c;可以使用zip()函数。zip()函数可以将多个可迭代对象合并成一个元组的迭代器&#xff0c;然后你可以在循环中使用它。 问题背景 当需要在Python脚本中避免重复相同任务时&#xff0c;可以使用for循环来遍历列表。但是…

Volatility-内存取证案例1-writeup--xx大赛

题目提示&#xff1a;flag{中文} 按部就班 &#xff08;1&#xff09;获取内存镜像版本信息 volatility -f 文件名 imageinfo 通过上述可知&#xff0c;镜像版本为Win7SP1X64。 &#xff08;2&#xff09;获取进程信息&#xff1a; volatility -f 镜像名 --profile第一步获取…

面壁智能完成新一轮数亿元融资,继续面向AGI的高效大模型征程

近日&#xff0c;面壁智能完成新一轮数亿元融资&#xff0c;由春华创投、华为哈勃领投&#xff0c;北京市人工智能产业投资基金等跟投&#xff0c;知乎作为战略股东持续跟投支持。本轮融资完成后&#xff0c;面壁智能将进一步推进优秀人才引入&#xff0c;加固大模型发展的底层…

6.12物联网RK3399项目开发实录-驱动开发之UART 串口的使用(wulianjishu666)

嵌入式实战开发例程【珍贵收藏&#xff0c;开发必备】&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1tkDBNH9R3iAaHOG1Zj9q1Q?pwdt41u UART 使用 简介 AIO-3399J 支持 SPI 桥接/扩展 4 个增强功能串口&#xff08;UART&#xff09;的功能&#xff0c;分别为 UA…

LeetCode 面试题 02.07.链表相交(判断两个结点是否相同)

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&#x…

Qt中的网络通信

C没有封装专门的网络套接字的类&#xff0c;因此C只能调用C对应的API&#xff0c;而在Linux和Windows环境下的API都是不一样的 Qt作为一个C框架提供了相关封装好的套接字通信类 在Qt中需要用到两个类&#xff0c;两个类都属于network且都是属于IO操作&#xff0c;只不过这两个类…

ArcGIS Desktop使用入门(三)图层右键工具——缩放至图层、缩放至可见

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

Java 怎么捕捉 Windows 中前台窗口的改变?

在Java中捕捉Windows中前台窗口的改变通常需要使用JNI&#xff08;Java Native Interface&#xff09;来调用Windows API。Windows API提供了一系列函数来获取有关窗口和进程的信息&#xff0c;通过使用这些函数&#xff0c;我们可以实现在Java程序中监视和捕捉Windows前台窗口…

抖音爬虫——点赞量

该爬虫模拟了一个get请求来得到返回json里面的点赞量信息 下面介绍如何使用&#xff1a; 首先&#xff0c;我们找一个浏览器打开抖音搜索具体的关键词 接着我们点击键盘的F12建 就会出现如下的界面&#xff0c;接着我们点击网络&#xff08;可能再一些浏览器是叫network&…

JavaSE:this关键字(代码和内存图讲解)

this的含义 this代表当前对象&#xff0c;谁调用this所在的方法&#xff0c;this就代表谁 这句话非常重要 demo 以这段代码为例&#xff0c;setNum方法内部的this&#xff0c;setStr方法内部的this&#xff0c;还有构造方法ThisKeyword(int num, String str)内部的两个this…

软件库V1.2版本开源-首页UI优化

iAppV3源码&#xff0c;首页的分类更换成了标签布局&#xff0c;各位可以参考学习&#xff0c;界面名称已经中文标注&#xff01; 老版本和现在的版本还是有较大的区别的&#xff0c;建议更新一下&#xff01; 新版本改动界面如下&#xff1a; 1、首页.iyu&#xff1a;分类按…

基于javassm实现的幼儿教育管理系统

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

晶核职业选择:六大角色技能揭秘,成为战斗高手!

在晶核的世界中&#xff0c;每一位玩家都扮演着不同角色&#xff0c;组成多样的团队&#xff0c;共同踏上探索未知的征程。而每个角色都有其独特的技能和特点&#xff0c;下面将为你详细介绍每个角色的技能搭配和操作技巧&#xff0c;让你在战斗中游刃有余&#xff0c;一展自己…

MPT - 原理及应用

前文回顾 Merkle原理及应用Merkle代码实现Patricia原理及应用Patricia代码实现 什么是MPT&#xff08;Merkle Patricia Tree&#xff09;树 MPT树是一种数据结构&#xff0c;用于在以太坊区块链中高效地存储和检索账户状态、交易历史和其他重要数据。MPT树的设计旨在结合Merk…

python之文件操作与管理

1、文件操作 通过open&#xff08;&#xff09;操作&#xff0c;来创建文件对象&#xff0c;下面是open&#xff08;&#xff09;函数语法如下&#xff1a; open&#xff08;file,mode r,buffering -1 , encoding None ,errors None , newline None,closefd True,opener …