题目链接:455. 分发饼干 - 力扣(LeetCode)
作者思考:
本题的题目的核心就是一句话:你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。那么问题来了,我们怎么知道怎样才能满足更多的小孩。为了满足更多的小孩,就要避免不必要的浪费,那么就是说我们要尽可能满足胃口大的孩子,让胃口大的孩子尽可能多的满足,达到局部最优解,那么在整个逻辑中就是全局最优解
用孩子的胃口取控制饼干
class Solution {
public int findContentChildren(int[] g, int[] s) {
//排序数组
Arrays.sort(g);
Arrays.sort(s);
int count = 0;
int size = s.length -1;
for (int i = g.length -1; i >= 0; i--) {
//优先满足胃口大的孩子
if (size >= 0 && s[size] >= g[i]) {
size--;
count++;
}
}
return count;
}
}
题目链接:376. 摆动序列 - 力扣(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. 最大子数组和 - 力扣(LeetCode)
作者思考:
本题的求的是连续的子数组(连续!!)那也就是说数组中连续遇到负数,累加后会越来越小,这点很重要。
局部最优:当前“连续和”为负数的时候,立即抛弃,从下一个值开始重新计算“连续和”。
全局最优:选取最大“连续和”
class Solution {
public int maxSubArray(int[] nums) {
int result = nums[0];//将第一个赋值给result
int count = 0;//定义累加和
for (int i = 0; i < nums.length; i++) {
count += nums[i];
if (count > result) {
result = count;
}
if (count < 0) {//当累加和小于0 从下一位重新计算和(负数只会越加越小)
count = 0;
}
}
return result;
}
}