刪除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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM