代码随想录算法训练营第三十一天|455.分发饼干、376.摆动序列、53.最大子序和

本文介绍了三种基于IT技术的算法问题:如何用排序和指针技巧解决分发饼干问题、计算摆动序列的最大长度以及找到整数数组的最大子序和。通过实例展示了如何使用数组排序和两个指针来高效求解。
摘要由CSDN通过智能技术生成

455.分发饼干

public class Solution {
    public int FindContentChildren(int[] g, int[] s) {
        Array.Sort(g);
        Array.Sort(s);
        int ans=0;
        int j=0;
        int i=0;
        while(i<g.Length)
        {
            while(j>=s.Length)
            {
            return ans;
            }
            if(g[i]<=s[j])
            {
                ans++;
                i++;
            }
            j++;
        }
        return ans;
    }
}

先将两个数组排序成从小到大的顺序,然后两个指针分别指向两个数组的起始位置,当I指针没遍历完人数数组之前进行循环,终止条件为J指针遍历完了饼干数组直接返回Ans结果,两个数组挨个比较,如果饼干大于等于人数两个数组均向后移动一个,否则饼干数组向后移动一个位置继续与当天人数进行比较,知道触碰终止条件。

376.摆动序列

public class Solution {
    public int WiggleMaxLength(int[] nums) {
        int cur=0;
        int pre=0;
        int cnt=1;
        if(nums.Length<=1)
        {
            return nums.Length;
        }
        for(int i=1;i<nums.Length;i++)
        {
            cur=nums[i]-nums[i-1];
            if((cur>0&&pre<=0)||(cur<0&&pre>=0))
            {
                cnt++;
                pre=cur;
            }
        }
        return cnt;
    }
}

创建两个指针变量,一个Cur指针,一个Pre指针,前者用于记录当前的差值,后者记录前一个差值。如果数组只有一个,那直接返回数组长度1,否则进行For循环Cur计算方法为Nums[I]-Nums[I-1],然后判断两种情况:当前大于零,前置小于等于零;当前小于零,前置大于等于零。如果是Cnt计数++,然后当前的值赋给前置的值,最终返回Cnt。

53.最大子序和

public class Solution {
    public int MaxSubArray(int[] nums) {
        int sum=0;
        int max=int.MinValue;
        if(nums.Length==1)
        {
            return nums[0];
        }
        for(int i=0;i<nums.Length;i++)
        {
            sum+=nums[i];
            max=Math.Max(sum,max);
            if(sum<=0)
            {
                sum=0;
            }
        }
        return max;
    }
}

该题的思路是只有正数才会有贡献值,所以每次求和比较Max和当前Sum大小,谁大留谁,然后如果遇到Sum小于零那就直接Sum赋值零,然后继续向后遍历,最终返回Max值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值