算法学习day31贪心part01-45553376
Posted lipin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法学习day31贪心part01-45553376相关的知识,希望对你有一定的参考价值。
package LeetCode.greedypart01; import java.util.Arrays; /** * 455. 分发饼干 * 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 * 对每个孩子 i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸; * 并且每块饼干 j,都有一个尺寸 s[j]。如果 s[j] >= g[i], * 我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 * 示例: * 输入: g = [1,2,3], s = [1,1] * 输出: 1 * 解释: * 你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。 * 虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。 * 所以你应该输出1 * */ public class AssignCookies_455 public static void main(String[] args) int [] g = 1,2,3; int [] s = 1,1; int result = findContentChildren(g,s); System.out.println(result); public static int findContentChildren(int[] g, int[] s) Arrays.sort(g); Arrays.sort(s); int count = 0; int start = s.length - 1; // 遍历胃口 for (int index = g.length - 1; index >= 0; index--) if(start >= 0 && g[index] <= s[start]) start--; count++; return count;
package LeetCode.greedypart01; /** * 53. 最大子数组和 * 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 * 子数组 是数组中的一个连续部分。 * 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] * 输出:6 * 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 * */ public class MaximumSubarray_53 public static void main(String[] args) int [] nums = -2,1,-3,4,-1,2,1,-5,4; int result = maxSubArray(nums); System.out.println(result); public static int maxSubArray(int[] nums) if (nums.length == 1) return nums[0]; int sum = Integer.MIN_VALUE; int count = 0; for (int i = 0; i < nums.length; i++) count += nums[i]; sum = Math.max(sum, count); // 取区间累计的最大值(相当于不断确定最大子序终止位置) if (count <= 0) count = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和 return sum;
package LeetCode.greedypart01; /** * 376. 摆动序列 * 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。 * 第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 * 例如,[1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3)是正负交替出现的。 * 相反,[1, 4, 7, 2, 5]和[1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。 * 子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。 * 给你一个整数数组 nums ,返回 nums 中作为 摆动序列 的 最长子序列的长度 。 * */ public class WiggleSubsequence_376 public static void main(String[] args) int [] nums = 1, 7, 4, 9, 2, 5; int result = wiggleMaxLength(nums); System.out.println(result); public static int wiggleMaxLength(int[] nums) if (nums.length <= 1) return nums.length; //当前差值 int curDiff = 0; //上一个差值 int preDiff = 0; int count = 1; for (int i = 1; i < nums.length; i++) //得到当前差值 curDiff = nums[i] - nums[i - 1]; //如果当前差值和上一个差值为一正一负 //等于0的情况表示初始时的preDiff if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) count++; preDiff = curDiff; return count;
每日一面day1
贪心算法与其弊端
贪心算法又称贪婪算法,见文思意,贪心贪心,无非就是想办法寻找最好的方法,对应到算法上即将一个问题分解成若干个小问题,每步选取当前最优解,贪心算法的弊端在于它并非对所有的问题都有效,当问题不具有最佳子结构或是贪心策略有后效性时,得出的结果可能就并不正确。相应的问题有背包问题,由此也可以引出动态规划,有兴趣的同学可自行学习
以上是关于算法学习day31贪心part01-45553376的主要内容,如果未能解决你的问题,请参考以下文章
算法学习day08字符串part01-344541offer05151offer58