zoukankan      html  css  js  c++  java
  • 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;
        }
        
    };
  • 相关阅读:
    hibernate框架的搭建与简单实现增删改
    $.ajax();详解
    利用json实现数据传输
    利用ajax实现数据传输
    错误:Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp;的解决
    简单使用jstl实现敏感字替换
    实用jstl实现未登录时不能绕过登录界面的效果
    简单实用jstl实现“登录|注册”
    简单实用jstl实现代码编写
    简单使用EL进行标签的替换
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/10946154.html
Copyright © 2011-2022 走看看