【一天三道算法题】代码随想录——Day15(困难题只有一道)

这篇具有很好参考价值的文章主要介绍了【一天三道算法题】代码随想录——Day15(困难题只有一道)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 滑动窗口最大值

题目链接:力扣

思路:

        这道题我认为最难的是编程语言本身并没有一个可以让你完全直接开始使用的一个数据结构,也就是说要自己造轮子。并且为了尽可能的减少维护元素的个数我们要学会去在能实现功能的前提下,维护尽可能少的数组元素。

        但是,Java为什么是神?我们可以利用Java中的双端队列来实现这一点!这会让我们的操作减少很多,减少了我们做题的负担。

代码:

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        ArrayDeque<Integer> que = new ArrayDeque<>();
        int n = nums.length;
        //结果数组,用于存放最终的结果,而n-k+1则是作为滑动窗口的大小,实现移动
        int[] result = new int[n-k+1];
        int index = 0;
        for(int i=0; i<n; i++) {
            //根据题意,i为nums下标,要在nums[n-k+1, i]中选出最大值,只需保证两点
            //1.队列头结点需要在[i-k+1, i]范围内,不符合要弹出
            while(!que.isEmpty() && que.peek() < i-k+1) {
                que.poll();
            }
            //2.因为是单调,要保证每次放进去的数字都比末尾的大,否则弹出
            while(!que.isEmpty() && nums[que.peekLast()] < nums[i]) {
                que.pollLast();
            }
            //3.将i添加进队列中
            que.offer(i);

            //因为单调,当i增长到符合第一个k范围时,每滑动一步就将队列头结点放入队列即可
            if(i>=k-1) {
                result[index++] = nums[que.peek()];
            }
        }
        return result;
    }
}

人生中第一道困难题,确实有难度,需要反复理解。

今天只有一道题,我要把它吃透。文章来源地址https://www.toymoban.com/news/detail-613788.html

到了这里,关于【一天三道算法题】代码随想录——Day15(困难题只有一道)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 代码随想录算法训练day4 | 链表

    目录 24. 两两交换链表节点 19. 删除链表倒数第n个节点 方法一:普通写法 方法二:双指针法 面试题:找链表相交节点 142. 判断环形链表 虚拟头节点的本质意义在于减少了特殊情况的处理。不用判断该节点是否在链表的第一位。 定义快慢两个指针。 fast先走n步,再让fast和s

    2024年02月04日
    浏览(45)
  • 代码随想录算法训练DAY25|回溯2

    代码随想录算法训练DAY25|回溯2

    力扣题目链接 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 说明: 所有数字都是正整数。 解集不能包含重复的组合。 示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]] 示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]

    2024年01月22日
    浏览(47)
  • 代码随想录算法练习Day1:二分查找

    代码随想录算法练习Day1:二分查找

    题目链接:704. 二分查找 卡哥视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找 二分法概述: 二分法(Binary Search)是一种在有序数组或列表中查找目标元素的算法。 二分法使用前提 : 有序数组或列表 :二分法要求在查找的数据结

    2024年04月23日
    浏览(50)
  • 代码随想录Day20 回溯算法 LeetCode77 组合问题

    代码随想录Day20 回溯算法 LeetCode77 组合问题

    以下内容更详细解释来自于:代码随想录 (programmercarl.com) 回溯法也叫回溯搜索法,是搜索法的一种,我们之前在二叉树中也经常使用到回溯来解决问题,其实 有递归就有回溯 ,有的时候回溯隐藏在递归之下,我们不容易发觉,今天我们来详细介绍一下什么是回溯,它能解决哪些问题.

    2024年02月08日
    浏览(47)
  • 代码随想录第一天

    代码随想录第一天

    1.1 class solution class表示声明一个类,solution表示解决方案。那么class Solution就是声明一个解决方案的类,类中用来存放关于解决这一问题所需要的各种函数和变量。 这样做的好处有: 生成若干实例互不干扰,每个类的实例内部的(非静态)成员变量是独立的。 对主函数没有任

    2024年02月06日
    浏览(13)
  • 代码随想录第二十一天

    题目链接 : 二叉搜索树的最小绝对差 自己的思路 :和验证二叉搜索树一样的思路!可以求每个相邻节点的差值的绝对值,然后和之前的差值的绝对值进行比较,取最小的为新的res;递归三部曲:1、传入参数:当前节点;2、终止条件:如果当前节点为空,直接返回;3、单层递

    2024年02月16日
    浏览(14)
  • 代码随想录图论 第一天 | 797.所有可能的路径 200. 岛屿数量

    代码随想录图论 第一天 | 797.所有可能的路径 200. 岛屿数量 一、797.所有可能的路径 题目链接:https://leetcode.cn/problems/all-paths-from-source-to-target/ 思路:求从0到n-1的所有路径,终止条件是当前节点为n-1。本题图的结构是group[][],group[x]表示x节点所能到达的所有节点的集合,深度

    2024年02月08日
    浏览(15)
  • 代码随想录第一天 | LeetCode704.二分查找,LeetCode 27.移除元素

    数组理论基础要点: 数组也是数据结构的一种, 是存放在连续内存空间上的相同类型数据的集合。 数组注意点: 数组下标都是从0开始的。 数组内存空间的地址是连续的。 因为上述两点, 数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要

    2024年02月08日
    浏览(14)
  • 代码随想录day59

    647. 回文子串 给你一个字符串  s  ,请你统计并返回这个字符串中  回文子串  的数目。 回文字符串  是正着读和倒过来读一样的字符串。 子字符串  是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不

    2024年02月07日
    浏览(46)
  • 代码随想录day01

    ● 思维不难,主要是考察对代码的掌控能力 ● 内存中的存储方式:存放在连续内存空间上的相同类型数据的集合 ● 数组可以通过下标索引获取到下标对应的数据 ● 数组下标从0开始 ● 因为内存空间地址连续,因此删除或增加元素的时候,难免移动其他元素地址 ● Java中的

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包