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值。