声明:
在学习贪心算法的时候,不要去在意贪心策略是怎样去证明的。把这些策略都累积成贪心经验即可
给定一个字符串类型的数组strs,找到一种拼接方式,使得把所有字 符串拼起来之后形成的字符串具有最低的字典序。
解释:字符串字典序。
ca > ac
当字符串长度相等时 。 从左向右。 c>a (c的ascll码大于a)后边的不需要判断 确定 ca 大于 ac
cac < d
当字符串长度不等时 。 长度短的字符串 自动右边补零 。扩大到相等长度再比较
d = d00 、 cac < d00
贪心策略。
进行一场排序。排序后,比较方法是。比较两个字符两种连接方式的大小。
例如:
"cac" "d" 两个字符串
两种连接方式
cac + d = cacd
d + cac = dcac
cacd > dcac
package basic_class_08;
import java.util.Arrays;
import java.util.Comparator;
public class Code_06_LowestLexicography {
public static class MyComparator implements Comparator<String> {
@Override
public int compare(String a, String b) {
return (a + b).compareTo(b + a);
}
}
public static String lowestString(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
Arrays.sort(strs, new MyComparator());
String res = "";
for (int i = 0; i < strs.length; i++) {
res += strs[i];
}
return res;
}
public static void main(String[] args) {
String[] strs1 = { "jibw", "ji", "jp", "bw", "jibw" };
System.out.println(lowestString(strs1));
String[] strs2 = { "ba", "b" };
System.out.println(lowestString(strs2));
}
}
一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目 的宣讲。 给你每一个项目开始的时间和结束的时间(给你一个数组,里面 是一个个具体的项目),你来安排宣讲的日程,要求会议室进行 的宣讲的场次最多。返回这个最多的宣讲场次。
贪心策略
优先选择结束时间最早的项目宣讲
package basic_class_08;
import java.util.Arrays;
import java.util.Comparator;
public class Code_07_BestArrange {
public static class Program {
public int start;
public int end;
public Program(int start, int end) {
this.start = start;
this.end = end;
}
}
public static class ProgramComparator implements Comparator<Program> {
@Override
public int compare(Program o1, Program o2) {
return o1.end - o2.end;
}
}
public static int bestArrange(Program[] programs, int start) {
Arrays.sort(programs, new ProgramComparator());
int result = 0;
for (int i = 0; i < programs.length; i++) {
if (start <= programs[i].start) {
result++;
start = programs[i].end;
}
}
return result;
}
public static void main(String[] args) {
}
}