Skip to content

Commit a3cc23b

Browse files
committed
贪心算法
1 parent c58edcf commit a3cc23b

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package day_0330;
2+
3+
import java.util.Arrays;
4+
import java.util.Collections;
5+
import java.util.Comparator;
6+
7+
/**392
8+
*
9+
* @author aml
10+
* @date 2021/5/4 22:29
11+
*
12+
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
13+
14+
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
15+
16+
输入: g = [1,2], s = [1,2,3]
17+
输出: 2
18+
解释:
19+
你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。
20+
你拥有的饼干数量和尺寸都足以让所有孩子满足。
21+
所以你应该输出2
22+
23+
*/
24+
public class A_45_455_分发饼干_贪心算法部分 {
25+
26+
27+
//贪心算法一般涉及 最大最小的,因此需要是排好序的
28+
public int findContentChildren(int[] g, int[] s) {
29+
//int[]数组倒序,不能直接使用Collections,这个是针对Integer包装类的;
30+
//Comparator<Integer>也是针对包装类
31+
// Arrays.sort(g,Collections.reverseOrder());
32+
Arrays.sort(g);
33+
Arrays.sort(s);
34+
35+
int gi=g.length-1, si =s.length-1; //指向数组末尾,即最大的
36+
int res = 0;
37+
while (gi>=0 && si>=0){
38+
if (s[si] >= g[gi]){
39+
res += 1;
40+
gi--;
41+
si--;
42+
}else {
43+
gi--;
44+
}
45+
}
46+
return res;
47+
}
48+
49+
50+
public static void main(String[] args) {
51+
52+
int g1[] = {1, 2, 3};
53+
int s1[] = {1, 1};
54+
System.out.println((new A_45_455_分发饼干_贪心算法部分()).findContentChildren(g1, s1));
55+
56+
int g2[] = {1, 2};
57+
int s2[] = {1, 2, 3};
58+
System.out.println((new A_45_455_分发饼干_贪心算法部分()).findContentChildren(g2, s2));
59+
}
60+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package day_0330;
2+
3+
import java.util.Arrays;
4+
import java.util.Comparator;
5+
6+
/**
7+
* @author aml
8+
* @date 2021/5/4 23:22
9+
* https://leetcode-cn.com/problems/non-overlapping-intervals/
10+
* 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
11+
*
12+
* 注意:
13+
* 可以认为区间的终点总是大于它的起点。
14+
* 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠
15+
输入: [ [1,2], [2,3], [3,4], [1,3] ]
16+
输出: 1
17+
解释: 移除 [1,3] 后,剩下的区间没有重叠。
18+
*/
19+
public class A_46_435_无重叠区间_贪心或dp {
20+
/**
21+
* 使用贪心算法:(一般是使用最大或最小的,所以一般涉及排序问题)
22+
* 想要最多的无重叠区间,可以类比想要参加最多聚会,[star][end]:开始~结束时间
23+
* 分四步:
24+
* 1. 将二维数组按照end时间进行 升序排序,即按照arr[1]
25+
* 2. 找出end最小的区间 x
26+
* 3. 把与x相交的区间全都删除
27+
* 4. 重复上述23两步操作,直到intervals为空
28+
* @param intervals
29+
* @return
30+
*/
31+
public int eraseOverlapIntervals(int[][] intervals) {
32+
33+
if(intervals == null || intervals.length <=0 )return 0;
34+
35+
// 1. 升序; 将intervals按照 intervals[1]进行升序排序
36+
Arrays.sort(intervals, new Comparator<int[]>() {
37+
@Override
38+
public int compare(int[] o1, int[] o2) {
39+
return o1[1] - o2[1];
40+
}
41+
});
42+
// 2. 第一个区间就是 x的区间, 统计与x区间相交的数量
43+
int count = 1; //
44+
int x_end = intervals[0][1];
45+
// 只要x_end < 后面区间star就都删除, 即star>=end
46+
for (int[] y : intervals){
47+
int star = y[0];
48+
if (star >= x_end){
49+
count++;
50+
x_end = y[1];
51+
}
52+
}
53+
54+
return intervals.length - count;
55+
}
56+
57+
}

0 commit comments

Comments
 (0)