首页 > 编程语言 >【代码随想录Day27】贪心算法Part01

【代码随想录Day27】贪心算法Part01

时间:2024-09-24 19:50:20浏览次数:3  
标签:nums Part01 Day27 随想录 ++ int length 哔哩 sum

理论基础

题目链接/文章讲解:代码随想录
视频讲解:贪心算法理论基础!_哔哩哔哩_bilibili

455.分发饼干

题目链接/文章讲解:代码随想录
视频讲解:贪心算法,你想先喂哪个小孩?| LeetCode:455.分发饼干_哔哩哔哩_bilibili

一开始使用了双重循环,时间复杂度为 ( O ( n × m ) ) (O(n \times m)) (O(n×m)),其中 ( n ) (n) (n) 是 g 的长度, ( m ) (m) (m) 是 s 的长度,会超出时间限制。我们可以通过使用双指针的方法将时间复杂度优化到 ( O ( n + m ) ) (O(n + m)) (O(n+m))。

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        // 首先对两个数组进行排序
        Arrays.sort(g);
        Arrays.sort(s);

        int count = 0;
        int i = 0; // 指向孩子的指针
        int j = 0; // 指向饼干的指针

        // 使用双指针遍历两个数组
        while (i < g.length && j < s.length) {
            if (s[j] >= g[i]) {
                // 如果当前饼干可以满足当前孩子,则计数加一,并且两个指针都向前移动
                count++;
                i++;
                j++;
            } else {
                // 如果当前饼干不能满足当前孩子,则只移动饼干的指针
                j++;
            }
        }

        return count;
    }
}

376. 摆动序列

题目链接/文章讲解:代码随想录
视频讲解:贪心算法,寻找摆动有细节!| LeetCode:376.摆动序列_哔哩哔哩_bilibili

class Solution {
    public int wiggleMaxLength(int[] nums) {
        if (nums.length < 2) {
            return nums.length;
        }

        int prevDiff = nums[1] - nums[0];
        int count = prevDiff != 0 ? 2 : 1; // 如果前两个数相同,则摆动序列长度为1,否则为2

        for (int i = 2; i < nums.length; i++) {
            int currDiff = nums[i] - nums[i - 1];
            if ((currDiff > 0 && prevDiff <= 0) || (currDiff < 0 && prevDiff >= 0)) {
                count++;
                prevDiff = currDiff;
            }
        }

        return count;
    }
}

53. 最大子序和

题目链接/文章讲解:代码随想录
视频讲解:贪心算法的巧妙需要慢慢体会!LeetCode:53. 最大子序和_哔哩哔哩_bilibili

class Solution {
    public int maxSubArray(int[] nums) {
        int maxSum = Integer.MIN_VALUE; // 初始化最大和为最小整数值
        int sum = 0; // 初始化当前子数组的和为0

        for (int i = 0; i < nums.length; i++) {
            sum += nums[i]; // 累加当前元素到当前子数组的和

            // 更新最大和
            if (sum > maxSum) {
                maxSum = sum;
            }

            // 如果当前子数组的和为负数,重置为0
            if (sum < 0) {
                sum = 0;
            }
        }

        return maxSum;
    }
}

标签:nums,Part01,Day27,随想录,++,int,length,哔哩,sum
From: https://blog.csdn.net/weixin_43724673/article/details/142498724

相关文章

  • 【代码随想录Day25】回溯算法Part04
    491.递增子序列题目链接/文章讲解:代码随想录视频讲解:回溯算法精讲,树层去重与树枝去重|LeetCode:491.递增子序列_哔哩哔哩_bilibiliclassSolution{List<List<Integer>>result=newArrayList<>();LinkedList<Integer>path=newLinkedList<>();pub......
  • 代码随想录算法训练营Day13 | 递归遍历、迭代遍历、层序遍历
    目录递归遍历和迭代遍历:144.二叉树的前序遍历94.二叉树的中序遍历145.二叉树的后序遍历层序遍历:102.二叉树的层序遍历107.二叉树的层序遍历Ⅱ199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧......
  • Day 23 贪心算法part01| LeetCode 455.分发饼干,376.摆动序列,53.最大子序和
    455.分发饼干455.分发饼干classSolution{publicintfindContentChildren(int[]g,int[]s){Arrays.sort(g);Arrays.sort(s);intindex=s.length-1;intcount=0;for(inti=g.le......
  • leetcode刷题day27|贪心算法Part01(455.分发饼干、376. 摆动序列、53. 最大子序和)
    前言:贪心的本质选择每一阶段的局部最优,从而达到全局最优。455.分发饼干思路:局部最优-大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个;全局最优:喂饱尽可能多的小孩。可以尝试使用贪心策略,先将饼干数组和小孩数组排序,然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计......
  • 【代码随想录Day24】回溯算法Part03
    93.复原IP地址题目链接/文章讲解:代码随想录视频讲解:回溯算法如何分割字符串并判断是合法IP?|LeetCode:93.复原IP地址_哔哩哔哩_bilibiliclassSolution{List<String>result=newArrayList<>();LinkedList<String>path=newLinkedList<>();publicL......
  • 代码随想录训练营第39天|树形dp
    198.打家劫舍classSolution{public:introb(vector<int>&nums){nums.insert(nums.begin(),0);intn=nums.size();vector<int>dp(n,INT_MIN);dp[0]=0;dp[1]=nums[1];for(inti=2;i<n;i++......
  • 【代码随想录Day23】回溯算法Part02
    39.组合总和题目链接/文章讲解:代码随想录视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)|回溯法精讲!_哔哩哔哩_bilibiliclassSolution{//存储最终结果的列表List<List<Integer>>result=newArrayList<>();//存储当前路......
  • 代码随想录算法训练营第一天 | 209. 长度最小的子数组 59. 螺旋矩阵 58. 区间和 Java
    209.长度最小的子数组题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/description/解题思路思路1:暴力解法通过两个for循环,找出所有的可能的区间,并比较出最小区间思路2:滑动窗口因为需要找出的是连续的一个子数组,所以可以模拟一个从左到右滑动的一个......
  • leetcode刷题day22|回溯算法Part01( 77. 组合 、216. 组合总和 III、17.电话号码的字母
    前言:回溯是递归的副产品,只要有递归就会有回溯,回溯函数也就是递归函数。回溯是暴力穷举解法,效率并不高。但一些问题只能使用回溯来解决。回溯法,一般可以解决如下几种问题:组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一......
  • 代码随想录算法 - 回溯3
    明天开始建模比赛,没时间写思路了题目193.复原IP地址有效IP地址正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。例如:"0.1.2.201"和"192.168.1.1"是有效IP地址,但是"0.011.255.245"、"192.168.1.312"和"[email protected]"是无......