美文网首页
Day7股票的最大利润+滑动窗口的最大值+把数字翻译成字符串

Day7股票的最大利润+滑动窗口的最大值+把数字翻译成字符串

作者: 吃掉夏天的怪物 | 来源:发表于2021-06-19 13:00 被阅读0次

TODO:

  1. 重做股票的最大利润
  2. 把数字翻译成字符串,再好好理解下方法二的递归
  3. 熟悉双端队列

一、剑指 Offer 63. 股票的最大利润(中等)

最开始想复杂了,理清楚思路就会简单许多。因为只交易一次,最大利润肯定是,每天的价值减去股票在这天以前的最小价值。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
       int n = prices.size();
       if( n == 0) return 0;
       int small = INT_MAX;
       int ans = 0;
       for(int i = 0; i < prices.size(); i++){
           if(prices[i] <small){small = prices[i];}
            ans = max(ans,prices[i]-small);
       }
       return ans;
    }
};

二、 剑指 Offer 59 - I. 滑动窗口的最大值(困难)

写了两个多小时的样子....貌似。从堆想到队列,再想到双端队列。
131205这个例子猜让我反应过来,但是用队列不能把比当前小的元素都出栈。
(官方题解的代码要清爽一些那就直接...)

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        deque<int> q;
        for (int i = 0; i < k; ++i) {
            while (!q.empty() && nums[i] >= nums[q.back()]) {
                q.pop_back();
            }
            q.push_back(i);
        }

        vector<int> ans = {nums[q.front()]};
        for (int i = k; i < n; ++i) {
            while (!q.empty() && nums[i] >= nums[q.back()]) {
                q.pop_back();
            }
            q.push_back(i);
            while (q.front() <= i - k) {
                q.pop_front();
            }
            ans.push_back(nums[q.front()]);
        }
        return ans;
    }
};

三、剑指 Offer 46. 把数字翻译成字符串(中等)

😢没有想出来。
仔细想想找找转移方程应该是能够做出来的。
⭐注意:把整数转为字符串的技巧to_string
方法一:

class Solution {
public:
    int translateNum(int num) {
        if(num ==  0) return 1;
        string str = to_string(num);
        int a = 1, b =1,c;
        for(int i = 2; i <= str.size(); i++){
            auto pre = str.substr(i - 2, 2);//⭐
            if (pre <= "25" && pre >= "10") {
                c  = a+b;
            }
            a = b;
            b = c;
        }  
        return b;
    }
};

方法二:⭐
由于该方法的对称性也可以从后往前来看

class Solution {
public:
    int ans = 0;
    void bt(int num) {
        if(num == 0)    {
            ans += 1;
            return ;
        }
        bt(num / 10);
        if(num % 100 >= 10 && num % 100 < 26)
            bt(num / 100);

    }
    int translateNum(int num) {
        bt(num);
        return ans;
    }
};

相关文章

  • Day7股票的最大利润+滑动窗口的最大值+把数字翻译成字符串

    TODO: 重做股票的最大利润 把数字翻译成字符串,再好好理解下方法二的递归 熟悉双端队列 一、剑指 Offer ...

  • 队列的最大值

    滑动窗口的最大值给定一个数组和滑动窗口的最大值,找出所有滑动窗口里的最大值。例如输入[2, 3, 4, 2, 6,...

  • leetcode239.滑动窗口最大值

    题目链接 解题思路一:最大堆 本题中,滑动窗口内的数字个数固定为k,从左依次滑动到右侧,要求返回滑动窗口的最大值,...

  • 剑指offer | 滑动窗口的最大值

    滑动窗口的最大值 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值 示例输入:{2, 3, 4, 2, ...

  • 59-滑动窗口最大值、队列的最大值

    1. 滑动窗口的最大值 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例:输入:...

  • JZ-064-滑动窗口的最大值

    滑动窗口的最大值 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,...

  • 剑指Offer66题

    1、滑动窗口的最大值 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4...

  • 面试题59(剑指offer)--队列的最大值

    题目一: 滑动窗口的最大值。给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2,3...

  • 剑指Offer Java版 面试题59:队列的最大值

    题目一:滑动窗口的最大值。给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3...

  • 面试题59:队列的最大值

    题目 滑动窗口的最大值给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2,3,4,...

网友评论

      本文标题:Day7股票的最大利润+滑动窗口的最大值+把数字翻译成字符串

      本文链接:https://www.haomeiwen.com/subject/bgmryltx.html