leetcode 402. Remove K Digits 、321. Create Maximum Number

402. Remove K Digitshtml

https://www.cnblogs.com/grandyang/p/5883736.htmlios

https://blog.csdn.net/fuxuemingzhu/article/details/81034522git

https://blog.csdn.net/qq508618087/article/details/52584133數組

題目的要求是刪除k個字符,在保證原字符串字符相對位置不變的狀況下得到最小的數字。函數

一個貪心的思想,維護一個單調遞增的棧。只能彈出k次。spa

res.resize(keep)對於在while循環裏刪除了k次的沒影響,但對於那些沒有刪除k次的就須要只提取前keep個數值。由於這是一個單調遞增棧,一樣keep位的數字,前面的生成的數字更小。.net

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 Numberdebug

https://www.cnblogs.com/grandyang/p/5136749.html指針

這道題和402. Remove K Digits很相似,maxNumber函數基本上就是402. Remove K Digits,只是這道題是求最大的值,且給的k不是刪除的個數,而是保留的個數。code

將兩個數組進行按照大小合併時,不能使用那種兩個指針滑動的方式。

兩個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;
    }
    
};
相關文章
相關標籤/搜索