力扣
Posted LinZeLiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣相关的知识,希望对你有一定的参考价值。
题目
思路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;
}
};
以上是关于力扣的主要内容,如果未能解决你的问题,请参考以下文章