代码随想录第二十七天| 455.分发饼干 376. 摆动序列 53. 最大子序和

455. 分发饼干

题目描述

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

  • 每个孩子 i 都有一个胃口值 g[i],这是能让孩子满足胃口的饼干的最小尺寸。
  • 每块饼干 j 都有一个尺寸 s[j]。如果 s[j] >= g[i],可以将饼干 j 分配给孩子 i,此时该孩子会得到满足。
  • 目标是尽可能满足更多的孩子,输出满足孩子的最大数量。

解题思路

  1. 贪心算法

    • 优先满足胃口值最小的孩子,从而将较小的饼干分配给需求较少的孩子,保留较大的饼干以满足需求较高的孩子。
    • 对孩子的胃口值数组 g 和饼干尺寸数组 s 进行排序。
    • 两种实现方式:
      • 从右往左遍历胃口值数组。
      • 从左往右遍历饼干数组。
  2. 实现步骤

    • 对两个数组 gs 进行排序。
    • 使用两个指针,分别记录当前孩子和当前饼干的位置。
    • 根据胃口值与饼干尺寸的比较关系,分配饼干并移动指针。

代码实现

class Solution {
    public int findContentChildren(int[] g, int[] s) {
		Arrays.sort(g);
		Arrays.sort(s);
		int count = 0;
		int right = s.length-1;
        for(int i=g.length-1;i>=0;i--){
			if (right>=0 && g[i] <= s[right]){
				right--;
				count++;
			}
		}
		return count;
    }
}
class Solution {
    public int findContentChildren(int[] g, int[] s) {
		Arrays.sort(g);
		Arrays.sort(s);
		int count = 0;
		int start = 0;
        for(int i=0;i<s.length;i++){
			if (start<g.length && s[i]>=g[start]){
				start++;
				count++;
			}
		}
		return count;
    }
}

376. 摆动序列

题目描述

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可以是正数或负数。少于两个元素的序列也是摆动序列。

  • 摆动序列示例
    • [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。
    • [1,4,7,2,5] 不是摆动序列,因为前两个差值都是正数。
    • [1,7,4,5,5] 不是摆动序列,因为最后一个差值为零。

目标:给定一个整数序列,返回作为摆动序列的最长子序列的长度。通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。


解题思路

  1. 贪心算法

    • 通过记录当前差值 curDiff 和前一个差值 preDiff 来判断是否符合摆动序列的条件。
    • (curDiff > 0 && preDiff <= 0)(curDiff < 0 && preDiff >= 0) 时,说明找到一个摆动点,计数器 count 加 1,同时更新 preDiff
    • 遍历整个数组即可完成最长摆动子序列的统计。
  2. 特殊情况

    • 如果数组长度小于等于 1,直接返回数组长度即可。

代码实现

class Solution {
    public int wiggleMaxLength(int[] nums) {
		if(nums.length<=1){
			return nums.length;
		}
		int curDiff = 0;
		//上一个差值
		int preDiff = 0;
		int count = 1;
        for(int i=1;i<nums.length;i++){
			curDiff = nums[i]-nums[i-1];
			if((curDiff>0 && preDiff <=0) || (curDiff < 0 && preDiff >= 0)){
				count++;
				preDiff = curDiff;
			}
		}
		return count;
    }
}

53. 最大子序和

题目描述

给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。


解题思路

  1. 动态规划

    • 遍历数组时,记录当前子数组的最大和 max
    • 如果当前子数组的和小于 0,则将其重置为 0,因为负数会对后续和产生负面影响。
    • 同时用一个变量 groupmax 来记录遍历过程中出现的最大子数组和。
  2. 贪心思想

    • 对于每个元素,判断加入当前子数组是否能增大和,如果不能,则重新开始新的子数组。

代码实现

class Solution {
    public int maxSubArray(int[] nums) {
		int max = 0;
		int groupmax = nums[0];
        for(int i =0 ;i< nums.length;i++){
			max = max + nums[i];
			if(groupmax<max){
				groupmax = max;
			}
			if(max<0){
				max = 0;
			}
		}
		return groupmax;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值