删除K个数字后的最小值(贪心算法实现)

Posted zldmy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除K个数字后的最小值(贪心算法实现)相关的知识,希望对你有一定的参考价值。

给出一个整数,从该整数中去掉k个数字,要求剩下的数字形成的新整数尽可能小。应该如何选取被去掉的数字?
其中,整数的长度大于或等于k,给出的整数的大小可以超过long类型的数字范围。
 
思路:
把原整数的所有数字从左到右进行比较,如果发现某一位数字大于它右面的数字,那么在删除该数字之后,必然会使该数位的值降低。这种求局部最优解,最终得到全局最优解的思想,叫作贪心算法
如果要删除k个数字,那么将遍历数字作为外层循环,以k作为外层循环,再结合栈的使用。将遍历的数字逐个入栈,遇到入栈进来的数字小于栈顶的数字时,将栈顶的数字出栈,再将该遍历的数字入栈,否则就直接将数字压栈。当出栈的数字达到k个时,将剩下的数字全部入栈即可。
 
举例:"541270936",去除3个数字。
  1. 5入栈,stack=[5]
  2. 4入栈,判断4<5,5出栈,4入栈。stack=[4]。出栈一次,num=1
  3. 1入栈,判断1<4,4出栈,1入栈。stack=[1]。出栈一次,num=2
  4. 2入栈,判断2>1,2直接入栈。stack=[1,2]
  5. 7入栈,判断7>2,7直接入栈。stack=[1,2,7]
  6. 0入栈,判断0<7,7出栈,0入栈。stack=[1,2,0]。出栈一次,num=3。此时出栈了3次,相当于去除了3个数字。满足要求。那么剩下的字符就直接入栈就可以了。
  7. 剩余字符全部入栈。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个数字后的最小值(贪心算法实现)的主要内容,如果未能解决你的问题,请参考以下文章

2017.12.27 算法分析 贪心算法删除数字求最小值问题

算法导论----贪心算法,删除k个数,使剩下的数字最小

算法学习——贪心算法之删数字(求最小值)

贪心算法-移除K个数字

4.6算法之贪心-3528:最小新整数

删数问题-贪心