删除K个数字后的最小值(贪心算法实现)
Posted zldmy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除K个数字后的最小值(贪心算法实现)相关的知识,希望对你有一定的参考价值。
给出一个整数,从该整数中去掉k个数字,要求剩下的数字形成的新整数尽可能小。应该如何选取被去掉的数字?
其中,整数的长度大于或等于k,给出的整数的大小可以超过long类型的数字范围。
思路:
把原整数的所有数字从左到右进行比较,如果发现某一位数字大于它右面的数字,那么在删除该数字之后,必然会使该数位的值降低。这种求局部最优解,最终得到全局最优解的思想,叫作“贪心算法”。
如果要删除k个数字,那么将遍历数字作为外层循环,以k作为外层循环,再结合栈的使用。将遍历的数字逐个入栈,遇到入栈进来的数字小于栈顶的数字时,将栈顶的数字出栈,再将该遍历的数字入栈,否则就直接将数字压栈。当出栈的数字达到k个时,将剩下的数字全部入栈即可。
举例:"541270936",去除3个数字。
- 5入栈,stack=[5]
- 4入栈,判断4<5,5出栈,4入栈。stack=[4]。出栈一次,num=1
- 1入栈,判断1<4,4出栈,1入栈。stack=[1]。出栈一次,num=2
- 2入栈,判断2>1,2直接入栈。stack=[1,2]
- 7入栈,判断7>2,7直接入栈。stack=[1,2,7]
- 0入栈,判断0<7,7出栈,0入栈。stack=[1,2,0]。出栈一次,num=3。此时出栈了3次,相当于去除了3个数字。满足要求。那么剩下的字符就直接入栈就可以了。
- 剩余字符全部入栈。stack=[1,2,0,9,3,6]
代码实现:
1 package blogSrc; 2 3 import com.sun.deploy.util.StringUtils; 4 5 import java.util.Arrays; 6 import java.util.Stack; 7 8 /** 9 * 删除K个数字后的最小值 10 * 11 * 给出一个整数,从该整数中去掉k个数字,要求剩下的数字形成的新整数尽可能小。应该如何选取被去掉的数字? 12 * 其中,整数的长度大于或等于k,给出的整数的大小可以超过long类型的数字范围。 13 * 14 * 思路:把原整数的所有数字从左到右进行比较,如果发现某一位数字大于它右面的数字,那么在删除该数字之后,必然会使该数位的值降低。 15 * 如果要删除k个数字,那么将遍历数字作为外层循环,以k作为外层循环,再结合栈的使用。将遍历的数字逐个入栈,否则就直接将数字压栈。 16 * 遇到入栈进来的数字小于栈顶的数字时,将栈顶的数字出栈,再将该遍历的数字入栈,当出栈的数字达到k个时, 17 * 将剩下的数字全部入栈即可。 18 */ 19 public class GetMinAfterRemoveKDigits 20 21 public static void main(String[] args) 22 String originStr = "541270936"; 23 String newStr = new GetMinAfterRemoveKDigits().getMinAfterRemoveKDigits(originStr,3); 24 System.out.println("OldString is: " + originStr); 25 System.out.println("NewString is: " + newStr); 26 27 28 public String getMinAfterRemoveKDigits(String originStr, int k) 29 char[] originArr = originStr.toCharArray(); 30 Stack<Character> stack = new Stack<>(); 31 stack.push(originArr[0]); 32 int num = 0; 33 for (int i=0; i<originArr.length; i++) 34 if (num == k) 35 stack.push(originArr[i]); 36 else 37 if (originArr[i] <= stack.peek()) 38 stack.pop(); 39 stack.push(originArr[i]); 40 num++; 41 else 42 stack.push(originArr[i]); 43 44 45 46 47 48 StringBuffer result = new StringBuffer(); 49 for (int i=0; i<stack.size(); i++) 50 result.append(stack.get(i)); 51 52 return result.toString(); 53 54
结果:
OldString is: 541270936
NewString is: 1270936
以上是关于删除K个数字后的最小值(贪心算法实现)的主要内容,如果未能解决你的问题,请参考以下文章