本文主要是介绍Day30 代码随想录(1刷) 贪心,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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 * 104
0 <= s.length <= 3 * 104
1 <= g[i], s[j] <= 231 - 1
状态:完成,不过wa了两次
思路:就是最大的饼干给胃口最大的学生就对了。不过要注意边界的条件,我就是没注意边界条件wa了两次。
class Solution {public int findContentChildren(int[] g, int[] s) {if(s.length==0) return 0;Arrays.sort(g);Arrays.sort(s);int sum=0;int right=s.length-1;for(int i=g.length-1;i>=0&&right>=0;i--){if(s[right]<g[i]) continue;if(s[right]>=g[i]) sum++;right--;}return sum;}
}
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 <= 1000
0 <= nums[i] <= 1000
状态:完成
思路:其实这一题就是要求几个峰值和谷值,我这里用的是一个栈去存储数组方便对数组进行增删,在上升时不断取最大的,在下降时不断取最小的,然后stack里存的就是有多少个峰跟谷了。有个大佬的代码非常简洁且明白,下面贴出来。
class Solution {public int wiggleMaxLength(int[] nums) {if(nums.length==1) return 1;Stack<Integer> stack=new Stack<>();stack.add(nums[0]);int type=0;for(int i=1;i<nums.length;i++){int num=stack.peek();if(num==nums[i]) continue;if(num>nums[i]&&type<=0){stack.add(nums[i]);type=1;}else if(num<nums[i]&&type>=0){stack.add(nums[i]);type=-1;}else if(num>nums[i]&&type>=0){stack.pop();stack.add(nums[i]);}else if(num<nums[i]&&type<=0){stack.pop();stack.add(nums[i]);} }return stack.size();}}
大佬的代码:
public int wiggleMaxLength(int[] nums) {int down = 1, up = 1;for (int i = 1; i < nums.length; i++) {if (nums[i] > nums[i - 1])up = down + 1;else if (nums[i] < nums[i - 1])down = up + 1;}return nums.length == 0 ? 0 : Math.max(down, up);
}作者:lghh
链接:https://leetcode.cn/problems/wiggle-subsequence/solutions/284327/tan-xin-si-lu-qing-xi-er-zheng-que-de-ti-jie-by-lg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
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)
的解法,尝试使用更为精妙的 分治法 求解。
状态:完成
思路:找最大子数组和,用两个值记录一个是最大值 result,一个是现阶段数组的和 count。count不断地加nums[i]然后更新result的值,如果count<0说明后面再加上这个区间只能越来越小,所以count=0,最后返回结果。
class Solution {public int maxSubArray(int[] nums) {int result=Integer.MIN_VALUE;int count=0;for(int i=0;i<nums.length;i++){count+=nums[i];result=Math.max(count,result);if(count<0){count=0;}}return result;}
}
感想:开始贪心,加油坚持。
这篇关于Day30 代码随想录(1刷) 贪心的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!