代码随想录 Day31 - 贪心算法(一)
作者:jjn0703
- 2023-07-29 江苏
本文字数:1658 字
阅读完需:约 5 分钟
理论基础
贪心算法解题步骤,一般分为如下四步:
将问题分解为若干个子问题
找出适合的贪心策略
求解每一个子问题的最优解
将局部最优解堆叠成全局最优解
作业题
455. 分发饼干
package jjn.carl.greedy;
import java.util.Arrays;
import java.util.Scanner;
/**
* @author Jjn
* @since 2023/7/29 18:24
*/
public class LeetCode455 {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int count = 0;
for (int i = 0, j = 0; i < g.length && j < s.length; ) {
if (s[j] >= g[i]) {
count++;
i++;
}
j++;
}
return count;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int gCount = scanner.nextInt();
int sCount = scanner.nextInt();
int[] g = new int[gCount];
int[] s = new int[sCount];
for (int i = 0; i < gCount; i++) {
g[i] = scanner.nextInt();
}
for (int i = 0; i < sCount; i++) {
s[i] = scanner.nextInt();
}
int contentChildren = new LeetCode455().findContentChildren(g, s);
System.out.println(contentChildren);
}
}
复制代码
376. 摆动序列
package jjn.carl.greedy;
import java.util.Scanner;
/**
* @author Jjn
* @since 2023/7/29 18:42
*/
public class LeetCode376 {
public 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;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int count = scanner.nextInt();
int[] nums = new int[count];
for (int i = 0; i < count; i++) {
nums[i] = scanner.nextInt();
}
int maxLength = new LeetCode376().wiggleMaxLength(nums);
System.out.println(maxLength);
}
}
复制代码
53. 最大子数组和
package jjn.carl.greedy;
import yz.LeetCode67_StrConverterNum;
import java.util.Map;
import java.util.Scanner;
/**
* @author Jjn
* @since 2023/7/29 19:35
*/
public class LeetCode53 {
public int maxSubArray(int[] nums) {
int prefix = 0;
int max = Integer.MIN_VALUE;
for (int num : nums) {
if (prefix < 0) {
prefix = 0;
}
prefix += num;
if (prefix >= 0) {
max = Math.max(prefix, max);
}
}
return max;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int count = scanner.nextInt();
int[] nums = new int[count];
for (int i = 0; i < count; i++) {
nums[i] = scanner.nextInt();
}
int maxSubArray = new LeetCode53().maxSubArray(nums);
System.out.println(maxSubArray);
}
}
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 3
版权声明: 本文为 InfoQ 作者【jjn0703】的原创文章。
原文链接:【http://xie.infoq.cn/article/39436c30ad46f81bb6be773e5】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
jjn0703
关注
Java工程师/终身学习者 2018-03-26 加入
USTC硕士/健身健美爱好者/Java工程师.
评论