力扣

Posted LinZeLiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣相关的知识,希望对你有一定的参考价值。

题目

剑指 Offer 59 - II. 队列的最大值

思路1(单调队列)

  • 剑指 Offer 59 - I. 滑动窗口的最大值基本一样,我们使用两个队列来解决问题:一个普通的队列,用于正常的队列操作;一个双端队列,这个队列是用来存储队列中的最大值的

代码

class MaxQueue {

    Deque<Integer> deque;
    Queue<Integer> queue;

    public MaxQueue() {
        deque = new LinkedList<>();
        queue = new LinkedList<>();
    }
    
    public int max_value() {
        // 双端队列的队首就是当前队列的最大值
        if (deque.isEmpty()) {
            return -1;
        } else {
            return deque.peekFirst();
        }
    }
    
    public void push_back(int value) {
        // 首先要先正常添加到普通队列中
        queue.offer(value);
        // 然后将value和双端队列的末尾元素进行比较,不断吧小雨value的值删除掉,然后找到第一个小于队尾元素的位置插入进去,如果没有就直接插入
        while (!deque.isEmpty() && deque.peekLast() < value) {
            deque.pollLast();
        }
        deque.offerLast(value);
    }
    
    public int pop_front() {
        if (queue.isEmpty()) {
            return -1;
        } else {
            // 弹出队列头的元素
            int value = queue.poll();
            // 弹出的时候还要比较该元素是不是队列中的最大值,如果是的话,就将它从双端队列中删除,然后第二大的元素成为队头(即此时队列中的最大值)
            if (value == deque.peekFirst()) {
                deque.pollFirst();
            }
            return value;
        }
    }
}

复杂度分析

  • 时间复杂度:\\(O(1)\\),插入、删除、获取最大值只需要\\(O(1)\\)时间复杂度即可
  • 空间复杂度:\\(O(N)\\),存储队列需要用到的空间
我走得很慢,但我从不后退!

贪心——力扣55.跳跃游戏&&力扣45.跳跃游戏Ⅱ

力扣55.跳跃游戏

题目描述

思路代码

依然是贪心的思路,考虑局部最优到整体最优,我们的目标是到达最后一个下标,是不是我们最终只要大于等于即可,那么我们就可以优先考虑跳跃所覆盖的范围,不用去明确每一步具体跳多少,我们每次移动最大跳跃步数,就更新最大的覆盖范围,最后得到最大的覆盖范围,判断是否到达终点

class Solution {
public:
    bool canJump(vector<int>& nums) 
    {
        int n = nums.size();
        if(n == 1) return true;
        int mostcover = 0;
        for(int i = 0; i < n; i++)
        {
            if(i <= mostcover)
            {
                mostcover = max(i + nums[i], mostcover);
            }

            if(mostcover >= n - 1)
            {
                return true;
            }
        }
        return false;
    }
};

力扣45.跳跃游戏Ⅱ

题目描述

思路代码

我们还是每一步都跳到最大覆盖范围,如果没有到达终点,则步数++,采取下一步,继续跳大最大覆盖范围,如果当前覆盖距离下标不是集合终点,步数++;如果当前覆盖最远距离下标就是集合终点,部署不用++

class Solution {
public:
    int jump(vector<int>& nums) 
    {
        int n = nums.size();
        if(n == 1) return 0;
        int CurDistance = 0;
        int res = 0;
        int NextDistance = 0;

        for(int i = 0; i < n; i++)
        {
            NextDistance = max(i + nums[i], NextDistance);
            if(i == CurDistance)
            {
                if(CurDistance != n - 1)
                {
                    res++;
                    CurDistance = NextDistance;
                    if(NextDistance >= n - 1) break;
                }
                else
                    break;
            }
            
        }
        return res;
    }
};

以上是关于力扣的主要内容,如果未能解决你的问题,请参考以下文章

贪心——力扣55.跳跃游戏&&力扣45.跳跃游戏Ⅱ

贪心——力扣53.最大子序和&&力扣122.买卖股票的最佳时机Ⅱ

刷力扣明白了官网代码的小心机(代码的优化)

链表

力扣刷题资源

力扣刷题详解(含代码动态展示)