依次求得局部最优解,最终得到全局最优解的思想,叫做贪心算法。
public class RemoveKDigits {
public static void main(String[] args) {
//删去k个数字后的最小值
//等价于删除1个数字后的最小值,循环k次。
RemoveKDigits removeKDigits = new RemoveKDigits();
String num = "1002345678";
System.out.println(removeKDigits.removeKDigits(num, 4));
}
//时间复杂度为O(kn)
private String removeKDigits(String num, int k) {
for (int i = 0; i < k; i++) {
boolean hasCut = false;
for (int j = 0; j < num.length() - 1; j++) {
//如果前一位数字比后一位数字大,删除前一位数字
if (num.charAt(j) > num.charAt(j + 1)) {
num = num.substring(0, j) + num.substring(j + 1);
hasCut = true;
break;
}
}
//如果没有删除成功,则删除最后一位数字
if (!hasCut) {
num = num.substring(0, num.length() - 1);
}
//清除左侧的无效数字0
while (num.startsWith("0")) {
num = num.substring(1);
}
//数字全部被删除后返回0
if (num.length() == 0) {
return "0";
}
}
return num;
}
}