leetcode 402. Remove K Digits 、321. Create Maximum Number
402. Remove K Digits
https://www.cnblogs.com/grandyang/p/5883736.html
https://blog.csdn.net/fuxuemingzhu/article/details/81034522
https://blog.csdn.net/qq508618087/article/details/52584133
题目的要求是删除k个字符,在保证原字符串字符相对位置不变的情况下获得最小的数字。
一个贪心的思想,维护一个单调递增的栈。只能弹出k次。
res.resize(keep)对于在while循环里删除了k次的没影响,但对于那些没有删除k次的就需要只提取前keep个数值。因为这是一个单调递增栈,同样keep位的数字,前面的生成的数字更小。
class Solution { public: string removeKdigits(string num, int k) { string res = ""; int keep = num.size() - k; for(char word : num){ while(k && res.size() && word < res.back()){ res.pop_back(); k--; } res.push_back(word); } res.resize(keep); while(!res.empty() && res[0] == '0') res.erase(res.begin()); return res.empty() ? "0" : res; } };
321. Create Maximum Number
https://www.cnblogs.com/grandyang/p/5136749.html
这道题和402. Remove K Digits很类似,maxNumber函数基本上就是402. Remove K Digits,只是这道题是求最大的值,且给的k不是删除的个数,而是保留的个数。
将两个数组进行按照大小合并时,不能使用那种两个指针滑动的方式。
两个vector数组进行比较,比较的是第一个位置的数的大小,如果相等会比较第二个位置的大小,直到有大小区别。
以下这个代码就证明了。
#include <iostream> #include <vector> using namespace std; int main(){ int a[] = {6,7}; int b[] = {6,0,4}; vector<int> num1(a,a+2); vector<int> num2(b,b+3); if(num1 > num2) cout << "debug" << endl; }
整个的思路其实就是在nums1中选i个元素组成的最大的数,nums2选k-i个元素组成最大的数,然后进行组合。
class Solution { public: vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) { int size1 = nums1.size(),size2 = nums2.size(); vector<int> res; for(int i = max(0,k - size2);i <= min(size1,k);i++){ res = max(res,mergeVector(maxNumber(nums1,i),maxNumber(nums2,k-i))); } return res; } vector<int> maxNumber(vector<int> nums,int k){ int del = nums.size() - k; vector<int> res; for(int i = 0;i < nums.size();i++){ while(del && res.size() && nums[i] > res.back()){ res.pop_back(); del--; } res.push_back(nums[i]); } res.resize(k); return res; } vector<int> mergeVector(vector<int> nums1,vector<int> nums2){ vector<int> res; while(!nums1.empty() || !nums2.empty()){ if(nums1 > nums2){ res.push_back(nums1[0]); nums1.erase(nums1.begin()); } else{ res.push_back(nums2[0]); nums2.erase(nums2.begin()); } } return res; } };