算法训练Day31|理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

简介: 算法训练Day31|理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

理论基础

代码随想录 (programmercarl.com)


贪心:局部最优,推出整体最优。

常识逻辑顺序推导/找不出反例


LeetCode:455.分发饼干

455. 分发饼干 - 力扣(LeetCode)


1.思路

题目示例都是有序的,不排序也能实现,但没有明确说明是有序的,提前拍个序比较稳妥.

①双层for循环暴力解法,遇到符合条件的用break终止本层for循环,返回计数器结果即可.


2.代码实现

 1class Solution {
 2    public int findContentChildren(int[] g, int[] s) {
 3        int count = 0;
 4        Arrays.sort(g);
 5        Arrays.sort(s);
 6        for (int i = s.length - 1; i >= 0; i--) {
 7            for (int j = g.length - 1; j >= 0; j--) {
 8                if (s[i] >= g[i]) {
 9                    count++;
10                    break;
11                }
12            }
13        }
14        return count;
15        // 计数器计数
16    }
17}

3.复杂度分析

时间复杂度:O(nlogn).数组排序的时间复杂度为O(nlogn),遍历数组的时间复杂度为O(n).

空间复杂度:O(n).创建count数值??


LeetCode:376. 摆动序列

376. 摆动序列 - 力扣(LeetCode)


1.思路

双指针法,求当前索引位置下的前后查值是否符合一正一负的条件,符合则count++,preDiff = curDiff


2.代码实现

 1class Solution {
 2    public int wiggleMaxLength(int[] nums) {
 3        if (nums.length <= 1) {
 4            return nums.length;
 5        }
 6        int curDiff = 0;
 7        int preDiff = 0;
 8        int count = 1;
 9        for (int i = 1; i < nums.length; i++) {
10            curDiff = nums[i] - nums[i - 1];
11            // 这里=只能给preDiff,curDiff上面被赋值之后,有可能会发生改变
12            if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) { 
13                count++;
14                preDiff = curDiff;
15            }
16        }
17        return count;
18    }
19}

3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(1).

LeetCode:53. 最大子序和

53. 最大子数组和 - 力扣(LeetCode)

1.思路

①两层for循环穷举所有子数组的和,比较得出最大值并返回即可

2.代码实现

 1// 暴力解法
 2class Solution {
 3    public int maxSubArray(int[] nums) {
 4        // 找到连续子数组,分别计算范围内的和,比较各个和
 5        int result = Integer.MIN_VALUE;
 6        for (int i = 0; i < nums.length; i++) {
 7            int curSum = 0;
 8            for (int j = i; j < nums.length; j++) {
 9                curSum += nums[j];
10                result = Math.max(result, curSum);
11            }
12        }
13        return result;
14    }
15}


// 时间复杂度:O(n^2)

// 空间复杂度:O(1)

 1// 贪心算法:剪枝操作
 2class Solution {
 3    public int maxSubArray(int[] nums) {
 4        int result = Integer.MIN_VALUE;
 5        int curSum = 0;
 6        for (int i = 0; i < nums.length; i++) {
 7            curSum += nums[i];
 8            result = Math.max(result, curSum);
 9            // 当前和为<= 0 时,剪枝操作
10            if (curSum <= 0) {
11                curSum = 0;
12            }
13        }
14        return result;
15    }
16}

3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(1).

相关文章
|
4天前
|
机器学习/深度学习 存储 算法
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
近端策略优化(PPO)是深度强化学习中高效的策略优化方法,广泛应用于大语言模型的RLHF训练。PPO通过引入策略更新约束机制,平衡了更新幅度,提升了训练稳定性。其核心思想是在优势演员-评论家方法的基础上,采用裁剪和非裁剪项组成的替代目标函数,限制策略比率在[1-ϵ, 1+ϵ]区间内,防止过大的策略更新。本文详细探讨了PPO的基本原理、损失函数设计及PyTorch实现流程,提供了完整的代码示例。
102 10
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
|
2月前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
206 80
|
1月前
|
负载均衡 算法 安全
探秘:基于 C++ 的局域网电脑控制软件自适应指令分发算法
在现代企业信息化架构中,局域网电脑控制软件如同“指挥官”,通过自适应指令分发算法动态调整指令发送节奏与数据量,确保不同性能的终端设备高效运行。基于C++语言,利用套接字实现稳定连接和线程同步管理,结合实时状态反馈,优化指令分发策略,提升整体管控效率,保障网络稳定,助力数字化办公。
52 19
|
2月前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
3月前
|
算法
优化策略:揭秘钢条切割与饼干分发的算法艺术
本文探讨了钢条切割与饼干分发两个经典算法问题,展示了算法在解决实际问题中的应用。钢条切割问题通过动态规划方法,计算出不同长度钢条的最大盈利切割方式,考虑焊接成本后问题更为复杂。饼干分发问题则采用贪心算法,旨在尽可能多的喂饱孩子,分别讨论了每个孩子一块饼干和最多两块饼干的情况。这些问题不仅体现了数学的精妙,也展示了工程师的智慧与创造力。
63 4
|
4月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
163 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
3月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
4月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
4月前
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
101 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
|
4月前
|
算法
第七章 回溯算法理论基础
第七章 回溯算法理论基础
44 0