网站推广句子,开个网要多少钱,谷歌推广方式,wordpress一定是主页吗目录 455. 分发饼干题目描述题解 376. 摆动序列题目描述题解 53. 最大子数组和题目描述题解 455. 分发饼干
点此跳转题目链接
题目描述
假设你是一位很棒的家长#xff0c;想要给你的孩子们一些小饼干。但是#xff0c;每个孩子最多只能给一块饼干。
对每个孩子 i#x… 目录 455. 分发饼干题目描述题解 376. 摆动序列题目描述题解 53. 最大子数组和题目描述题解 455. 分发饼干
点此跳转题目链接
题目描述
假设你是一位很棒的家长想要给你的孩子们一些小饼干。但是每个孩子最多只能给一块饼干。
对每个孩子 i都有一个胃口值 g[i]这是能让孩子们满足胃口的饼干的最小尺寸并且每块饼干 j都有一个尺寸 s[j] 。如果 s[j] g[i]我们可以将这个饼干 j 分配给孩子 i 这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子并输出这个最大数值。
示例 1:
输入: g [1,2,3], s [1,1]
输出: 1
解释:
你有三个孩子和两块小饼干3个孩子的胃口值分别是1,2,3。
虽然你有两块小饼干由于他们的尺寸都是1你只能让胃口值是1的孩子满足。
所以你应该输出1。示例 2:
输入: g [1,2], s [1,2,3]
输出: 2
解释:
你有两个孩子和三块小饼干2个孩子的胃口值分别是1,2。
你拥有的饼干数量和尺寸都足以让所有孩子满足。
所以你应该输出2.提示
1 g.length 3 * 1040 s.length 3 * 1041 g[i], s[j] 231 - 1
题解
贪心算法入门题目贪心思路为 优先用较小的饼干满足较小胃口的孩子 。这应该也是相当符合直觉的思路了
class Solution
{
public:int findContentChildren(vectorint g, vectorint s){// 贪心算法能满足就先满足// 先将胃口数组和尺寸数组都先从小到大排序sort(g.begin(), g.end());sort(s.begin(), s.end());int child 0, cookie 0;while (child g.size() cookie s.size()) {if (s[cookie] g[child]) // 每次尝试满足当前胃口最小的孩子cookie, child;else // 满足不了就换下一块饼干cookie;}return child;}
};376. 摆动序列
点此跳转题目链接
题目描述
如果连续数字之间的差严格地在正数和负数之间交替则数字序列称为 **摆动序列 。**第一个差如果存在的话可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。
例如 [1, 7, 4, 9, 2, 5] 是一个 摆动序列 因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。相反[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列第一个序列是因为它的前两个差值都是正数第二个序列是因为它的最后一个差值为零。
子序列 可以通过从原始序列中删除一些也可以不删除元素来获得剩下的元素保持其原始顺序。
给你一个整数数组 nums 返回 nums 中作为 摆动序列 的 最长子序列的长度 。
示例 1
输入nums [1,7,4,9,2,5]
输出6
解释整个序列均为摆动序列各元素之间的差值为 (6, -3, 5, -7, 3) 。示例 2
输入nums [1,17,5,10,13,15,10,5,16,8]
输出7
解释这个序列包含几个长度为 7 摆动序列。
其中一个是 [1, 17, 10, 13, 10, 16, 8] 各元素之间的差值为 (16, -7, 3, -3, 6, -8) 。示例 3
输入nums [1,2,3,4,5,6,7,8,9]
输出2提示
1 nums.length 10000 nums[i] 1000
进阶 你能否用 O(n) 时间复杂度完成此题?
题解
贪心算法解决。注意到题目中说的子序列实际上 不是连续的 所以我们完全可以在一次遍历达到进阶要求的 O ( n ) O(n) O(n) 时间复杂度中 “跳过” 那些 没有“摆动” 的部分相当于只统计数组中的 极大值和极小值 数量即可。 ⚠️ 是“极值”局部而不是“最值”整体 代码随想录 将其描述为统计“局部峰值”包括高峰和低谷也很直观 代码C
class Solution
{
public:int wiggleMaxLength(vectorint nums){// 仅有一个元素或者含两个不等元素的序列也视作摆动序列if (nums.size() 1)return 1;if (nums.size() 2)return nums[0] nums[1] ? 1 : 2;// 贪心算法int prevDiff nums[1] - nums[0]; // 前两个数的差值int curDiff; // 当前两个数的差值int len nums[0] nums[1] ? 1 : 2; // 摆动子序列的长度for (int i 2; i nums.size(); i){curDiff nums[i] - nums[i - 1];if (curDiff * prevDiff 0 || (prevDiff 0 curDiff ! 0)){prevDiff curDiff; // 只在“摆动”时才更新prevDifflen;}}return len;}
};有几处细节需要注意
1️⃣ 循环中只需要在发生了“摆动”时才更新 prevDiff 否则遇到连续的相同数字组成的“平坡”会被干扰差值总是为0
2️⃣ curDiff * prevDiff 0 的含义两个差值“一正一负”发生摆动
3️⃣ prevDiff 0 curDiff ! 0 的含义特殊情况——数组起始就有一个平坡例如 3, 3, 3, 2, 5 此时开头的 3, 3, 3 也相当于一个极值需要记录。可以看到除此之外prevDiff 总是不为0的因为除了一开始 prevDiff 都是由 curDiff 更新来的而前一个条件判断确保了更新时 curDiff 不为0。 53. 最大子数组和
点此跳转题目链接
题目描述
给你一个整数数组 nums 请你找出一个具有最大和的连续子数组子数组最少包含一个元素返回其最大和。
子数组 是数组中的一个连续部分连续的 非空 元素序列。
示例 1
输入nums [-2,1,-3,4,-1,2,1,-5,4]
输出6
解释连续子数组 [4,-1,2,1] 的和最大为 6 。示例 2
输入nums [1]
输出1示例 3
输入nums [5,4,-1,7,8]
输出23提示
1 nums.length 105-104 nums[i] 104
进阶 如果你已经实现复杂度为 O(n) 的解法尝试使用更为精妙的 分治法 求解。
题解
经典的贪心算法。在遍历过程中如果当前子数组之和为 负数 那么再往里面添加下一个数字相当于减小了下一个数字。所以此时我们可以贪心地直接将前面这个和为负子数组“累赘”丢掉
int maxSubArray(vectorint nums)
{// 贪心算法int curSum 0, maxSum INT_MIN;for (int i 0; i nums.size(); i) {curSum nums[i];maxSum max(curSum, maxSum);if (curSum 0) // 当前子数组和为负就是个“累赘”丢掉curSum 0; }return maxSum;
}也可以进一步简化更优雅
int maxSubArray(vectorint nums)
{int curSum nums[0], maxSum curSum;for (int i 1; i nums.size(); i) {curSum max(curSum nums[i], nums[i]);maxSum max(curSum, maxSum);}return maxSum;
}