删数问题(贪心法经典问题)

问题描述:用键盘输入一个高精度的正整数N,去掉其中S个数字后剩下的数字按原左右次序排列组成一个新的正整数。

     编程给定的N和S,寻找一个方案使得剩下的数字哦组成的新数最小。

思路解析: 使用逼近目标的贪心法来逐一逼近删除其中s个数符,每一步总数选择一个是剩下的数最小的数符删除。这样的贪心选择因为删除S个数符的全优解包含了删除一个

     数符的子问题的最优解。按从左到右寻找递减区间,删除第一个数字。若找不到递减区间 则删除末尾的数字。

 1 void find_Min_Integer(vector<int> &nums,int S)
 2 {
 3     vector<int> result;
 4 
 5      if(S>nums.size())
 6      {
 7         nums.clear();
 8         return;
 9      }
10      //从左到右寻找递归序列
11 
12      while(S>0)
13      {
14         int i;
15         for(i=0;(i<nums.size())&&(nums[i]<=nums[i+1]);i++)
16             ;
17         nums.erase(i);  //删除该区间的首字符  包括找不到递减区间时 删除末尾
18         S--;
19      }
20 
21      while(nums.size()>1&&nums[0]==0)  //删除头部的无效数字0
22         nums.erase(0);
23 }

贪心选择性质:可通过局部最优选择来达到全局最优解。

原文地址:https://www.cnblogs.com/xiaoying1245970347/p/4630399.html