首页 > 其他分享 >[代码随想录] 第十一天

[代码随想录] 第十一天

时间:2024-01-22 18:46:49浏览次数:47  
标签:第十一天 deque nums int max 代码 元素 随想录 ans

239. 滑动窗口最大值[https://leetcode.cn/problems/sliding-window-maximum/submissions/497438333/]
思路:滑动窗口大小为K,现在前K个数中找到Max值进入ans数组,然后开始向后遍历,每进入一个数字时先判断if(nums[i-k]==max),查看上一个max是否被滑动窗口滑出,若已滑出则在当前滑动窗口内重新找到max值并进入ans数组,重复上述过程知道数组遍历完成。

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (k == 1) {
            return nums;
        }
        int[] ans = new int[nums.length - k + 1];
        int max = nums[0];
        int i = 0;
        for (; i < k; i++) {
            max = nums[i] > max ? nums[i] : max;
        }
        ans[0] = max;
        for (int j = 1; i < nums.length; i++, j++) {
            if (nums[i - k] == max) {
                max = nums[i - k + 1];
                for (int x = i - k + 1; x <= i; x++) {
                    max = nums[x] > max ? nums[x] : max;
                }
            }
            max = nums[i] > max ? nums[i] : max;
            ans[j] = max;
        }
        return ans;
    }
}
**测试用例通过了,但耗时太长。**

-----------------------------------------------------------------------------------------------------------
优化思路:使用队列实现,保持max始终在队头(当队头元素小于入队元素时,队头元素出队),当队头元素退出滑动窗口时,队头元素退出队列
-----------------------------------------------------------------------------------------------------------
class MyQueue {
    Deque<Integer> deque = new LinkedList<>();

    void poll(int val) {
        if (!deque.isEmpty() && val == deque.peek()) {
            deque.poll();
        }
    }

    void add(int val) {
        while (!deque.isEmpty() && val > deque.getLast()) {
            deque.removeLast();
        }
        deque.add(val);
    }

    int peek() {
        return deque.peek();
    }
}

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums.length == 1) {
            return nums;
        }
        int len = nums.length - k + 1;
        // 存放结果元素的数组
        int[] res = new int[len];
        int num = 0;
        // 自定义队列
        MyQueue myQueue = new MyQueue();
        // 先将前k的元素放入队列
        for (int i = 0; i < k; i++) {
            myQueue.add(nums[i]);
        }
        res[num++] = myQueue.peek();
        for (int i = k; i < nums.length; i++) {
            // 滑动窗口移除最前面的元素,移除是判断该元素是否放入队列
            myQueue.poll(nums[i - k]);

            myQueue.add(nums[i]);

            res[num++] = myQueue.peek();
        }
        return res;
    }
}

347.前K个高频元素[https://leetcode.cn/problems/top-k-frequent-elements/description/]
思路:没有使用代码录中的大根堆,太难了...我使用Map记录每个元素的值与其出现次数,再使用Collections.sort重写Comparator,对Map中按value排序,前K个高频元素就是遍历元素时前K个元素的Key。

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i : nums) {
            if (!map.containsKey(i)) {
                map.put(i, 1);
            } else {
                map.put(i, map.get(i) + 1);
            }
        }
        Set<Map.Entry<Integer, Integer>> es = map.entrySet();
        List<Map.Entry<Integer, Integer>> l1 = new ArrayList<>(es);
        Collections.sort(l1, new Comparator<Map.Entry<Integer, Integer>>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                return o2.getValue() - o1.getValue();
            }
        });
        int i = 0;
        int[] ans = new int[k];
        for (Map.Entry<Integer, Integer> e : l1) {
            ans[i] = e.getKey();
            i++;
            if (i == k) {
                break;
            }
        }
        return ans;
    }

}

------------------------
这两天的题我感觉都特别难...
------------------------

标签:第十一天,deque,nums,int,max,代码,元素,随想录,ans
From: https://www.cnblogs.com/cssg/p/17980730

相关文章

  • 微前端(矩阵项目)代码将单个文件合并到指定分支
    确保你当前位于要合并文件的源分支上。可以使用gitbranch命令查看当前分支,并使用gitcheckout命令切换到源分支。使用gitcheckout命令切换到目标分支,即你想要合并文件的分支。gitcheckoutsource_branch--path/to/filesource_branch是包含要合并文件的源分支,path/to/f......
  • 代码随想录 day27 组合总和 组合总和 II 分割回文串
    组合总和其实总的思路和前面几类组合问题区别不大本题由于说明了元素可以重复选取且无需考虑sum为0的情况只需要把边界的startIndex迭代从i+1变成i即可i表示可以选取元素本身很容易写出以下未进行剪枝的代码剪枝情况只是多了一种也就是sum+下一个候选元素>targ......
  • cmake管理的代码工程添加openssl库
    提问:我写了一个C++的代码,用的cmake来管理的代码。我的C++代码里面用到了#include<openssl/ssl.h>。我在cmake里面有include_directories(/usr/include),因为openssl在/usr/include目录下面。cmake是编译一个sylar2023的动态库,动态库里面要包含ssl里面的文件或方法或者库......
  • 代码生成器
    <!--代码生成器--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.4.0</version></dependency><!--velocity模板引擎--><depen......
  • 【快速阅读二】从OpenCv的代码中扣取泊松融合算子(Poisson Image Editing)并稍作优化
    泊松融合是一种非常不错多图融合算法,在OpenCv的相关版本中也包含了该算子模块,作者尝试着从OpenCv的大仓库中扣取出该算子的全部代码,并分享了一些在扣取代码中的心得和收获。泊松融合我自己写的第一版程序大概是2016年在某个小房间里折腾出来的,当时是用......
  • 代码静态测试工具Helix QAC 2023.4新发布
    喜欢本篇文章速速点赞评论⭐收藏 HelixQAC2023.4为新的MISRAC++:2023指南推出了100%MISRAC++:2023®规则覆盖率。此版本还包括扩展的C++20语言支持、数据流分析的性能改进以及整个产品中的许多产品体验增强功能。 Jumpto你喜欢的部分 增强对C++20的支持......
  • python代码生成圣诞树
    用turtle生成彩色圣诞树图片,有树,有雪,有星星一、简介本文将介绍如何使用Python的turtle库来生成一个彩色的圣诞树图片。我们将使用turtle库绘制树、雪花和星星,然后将其保存为图片文件。二、准备工作安装turtle库:在命令行中输入pipinstallPythonTurtle进行安装。准备一张空......
  • 网页底部显示 “本站已安全运行……天” 代码
    <spanid="runtimeSpan"style="color:#ff0000;"></span><scripttype="text/javascript">functionshowRuntime(){window.setTimeout("showRuntime()",1000);varstartTime=newDate......
  • 代码的艺术-Writing Code Like a Pianist
    前言如何评定一个系统的质量?什么样的系统或者软件可以称之为高质量?可以从三个角度来看,一是架构设计,例如技术选型、分布式系统中的数据一致性考虑等,二是项目管理,无论是敏捷开发还是瀑布式开发,都应当对技术负债进行清理,对代码进行重构等,最后离不开的是代码质量,代码质量的高低直接影......
  • 基础架构即代码 | 亚马逊如何在现实生活中实践 DevOps
    当我在2005年作为开发人员加入亚马逊时(那时AmazonWebServices还不存在),我从公司领了一个传呼机(如图1所示)。在亚马逊,开发人员不仅要设计实现一个具体的服务,还要负责这个服务的部署和管理。为了完成运营任务,开发人员需要轮流“值班”,随时准备故障诊断和处理。传呼机就是值班......