代码随想录刷题|贪心算法理论 LeetCode455.分发饼干 376. 摆动序列 53. 最大子序和

简介: 代码随想录刷题|贪心算法理论 LeetCode455.分发饼干 376. 摆动序列 53. 最大子序和

贪心算法理论


  • 贪心算法分阶段工作
  • 在每一个阶段,可以认为所作决定是好的,而不考虑将来的后果
  • 这意味着选择的是某个局部最优,这种“眼下能够拿到的就拿”的策略是这类算法的名称的来源
  • 当算法终止的时候,我们希望局部最优等于全局最优。如果是这样的话,那么算法就算正确
  • 贪心算法没有什么套路


455.分发饼干

题目链接:力扣

思路


这里有两种思路:


       1、优先考虑胃口:从大到小一次遍历胃口,先满足胃口大的

               想象一下,你坐在一个椅子上,有的饼干为【1,3,5,9】,然后孩子的胃口为【1,2,7,10】.孩子们按照胃口从大到小的顺序来拿饼干,为了满足更多的小孩,就不要造成饼干尺寸的浪费,每个孩子来了你都给最大的

               10 来了  没有

               7  来了   给9

               2  来了   给5

               1  来了   给3


689ab9e8443b4632b030ad1703af56f6.png

  2、优先考虑饼干:孩子按照胃口从小到大来,给饼干也从小到大,给满足胃口即可,打发一个是一个

               拿出1  1可以

               拿出3   2可以

               拿出5   7不可以

               拿出9   7可以

5036c6abd06242f18b797ee09f42f245.png


分发饼干

优先考虑胃口

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        // 饼干指针
        int sIndex = s.length - 1;
        // 胃口满足了的孩子的数量
        int count = 0;
        // 递减饼干
        for (int gIndex = g.length - 1; gIndex >= 0; gIndex--) {
            if (sIndex >= 0 && s[sIndex] >= g[gIndex]) {
                sIndex--;
                count++;
            }
        }
        return count;  
    }
}

优先考虑饼干

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int gIndex = 0;
        // 胃口满足了的孩子的数量
        int count = 0;
        for (int sIndex = 0; sIndex < s.length; sIndex++) {
            if (gIndex < g.length && s[sIndex] >= g[gIndex]) {
                count++;
                gIndex++;
            }
        }
        return count;     
    }
}


376. 摆动序列

题目链接:力扣

思路

删是不可能删的,核心思想一句话:记录满足峰值的的数字数量


       局部最优:满足峰值的,当一个值满足 左小右大 或者 左大右小 的时候进行记录


       全局最优:所有满足峰值情况的数字长度,就是摆动序列的数量,其他不符合要求的并没有记录


       对这里的条件还不是很理解


摆动序列

class Solution {
    public int wiggleMaxLength(int[] nums) {
        if (nums.length <= 1) {
            return nums.length;
        }
        // 目前一对数字的差值
        int curDiff = 0;
        // 前一对数字的差值
        int preDiff = 0;
        // 符合要求的数量
        int result = 1;
        for (int i = 0; i + 1 < nums.length; i++) {
            // 计算当前一对数字的差值
            curDiff = nums[i + 1] - nums[i];
            // 出现峰值的数字
            if ((curDiff > 0 && preDiff <= 0)||(preDiff >= 0 && curDiff < 0)) {
                result++;
                preDiff = curDiff;
            }
        }
        return result;
    }
}

在LeetCode上看到一个很绝的写法,特别妙,变相取峰值

class Solution {
    public int wiggleMaxLength(int[] nums) {
        int n = nums.length;
        if (n < 2) {
            return n;
        }
        int up = 1;
        int down = 1;
        for (int i = 1; i < n; i++) {
            if (nums[i] > nums[i - 1]) {
                up = down + 1;
            }
            if (nums[i] < nums[i - 1]) {
                down = up + 1;
            }
        }
        return Math.max(up, down);
    }
}

53. 最大子序和

题目链接:力扣

思路


 拿到题是真的没思路,能想到的最简单的就是使用回溯,但是会超出市场,应该使用其他方法


       然后看了一下题解,真的想的太复杂了,使用了暴力解法,但是超出时长了


       所以只好使用贪心算法,贪心算法的贪在于:只要当前和出现了负数,就会从0开始计数,因为负数只会降低“连续和”


最大子序和

暴力解法

超出时间限制 不可用

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

贪心算法

class Solution {
    public int maxSubArray(int[] nums) {
        int result = Integer.MIN_VALUE;
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            count += nums[i];
            if (count > result) {
                result = count;
            }
            if (count < 0) {
                count = 0;
            }
        }
        return result;
    }
}
相关文章
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
38 0
|
1天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
23天前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
21 2
|
26天前
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
59 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
|
2月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
111 19
|
2月前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
54 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
107 2
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
11 1