算法训练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).

相关文章
|
2月前
|
存储 算法 索引
模拟算法题练习(二)(DNA序列修正、无尽的石头)
模拟算法题练习(二)(DNA序列修正、无尽的石头)
|
3月前
|
编解码 算法 定位技术
GEE时序——利用sentinel-2(哨兵-2)数据进行地表物候学分析(时间序列平滑法估算和非平滑算法代码)
GEE时序——利用sentinel-2(哨兵-2)数据进行地表物候学分析(时间序列平滑法估算和非平滑算法代码)
93 3
|
13天前
|
机器学习/深度学习 人工智能 运维
人工智能平台PAI 操作报错合集之请问Alink的算法中的序列异常检测组件,是对数据进行分组后分别在每个组中执行异常检测,而不是将数据看作时序数据进行异常检测吧
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。
|
14天前
|
算法 数据安全/隐私保护 数据格式
基于混沌序列的图像加解密算法matlab仿真,并输出加解密之后的直方图
该内容是一个关于混沌系统理论及其在图像加解密算法中的应用摘要。介绍了使用matlab2022a运行的算法,重点阐述了混沌系统的特性,如确定性、非线性、初值敏感性等,并以Logistic映射为例展示混沌序列生成。图像加解密流程包括预处理、混沌序列生成、数据混淆和扩散,以及密钥管理。提供了部分核心程序,涉及混沌序列用于图像像素的混淆和扩散过程,通过位操作实现加密。
|
15天前
|
编解码 算法 数据可视化
【视频】时间序列分类方法:动态时间规整算法DTW和R语言实现
【视频】时间序列分类方法:动态时间规整算法DTW和R语言实现
|
1月前
|
存储 算法
从动态规划到贪心算法:最长递增子序列问题的方法全解析
从动态规划到贪心算法:最长递增子序列问题的方法全解析
106 2
|
3月前
|
算法 测试技术 C++
【动态规划】【C++算法】801. 使序列递增的最小交换次数
【动态规划】【C++算法】801. 使序列递增的最小交换次数
|
4月前
|
算法
联想算法题-发牌序列
联想算法题-发牌序列
18 0
|
4月前
|
算法 JavaScript
JS算法-最长连续序列
JS算法-最长连续序列
|
4月前
|
算法 Java C++
试题 算法训练 摆动序列
试题 算法训练 摆动序列
20 1