力扣爆刷第113天之CodeTop100五连刷51-55

力扣爆刷第113天之CodeTop100五连刷51-55

文章目录

      • 力扣爆刷第113天之CodeTop100五连刷51-55
      • 一、239. 滑动窗口最大值
      • 二、41. 缺失的第一个正数
      • 三、LCR 140. 训练计划 II
      • 四、322. 零钱兑换
      • 五、76. 最小覆盖子串

一、239. 滑动窗口最大值

题目链接:https://leetcode.cn/problems/sliding-window-maximum/description/
思路:自己创建一个队列,提供API,关键在于,往队列里添加元素时,但凡是小于当前值的都可以出队,然后遍历数组,维护好滑动窗口,最大值就是队列左端(得益于上面的出队操作),滑动窗口缩小就从队列左端比较,nums[i-k+1] == 左端,就删除元素,其他的记录即可。

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {MyQueue queue = new MyQueue();int[] res = new int[nums.length-k+1];int j = 0;for(int i = 0; i < nums.length; i++) {queue.add(nums[i]);if(i >= k-1) {res[j++] = queue.getMax();queue.remove(nums[i-k+1]);}}return res;}class MyQueue{LinkedList<Integer> queue = new LinkedList<>();public MyQueue(){}void add(int v) {while(!queue.isEmpty() && queue.getLast() < v) {queue.removeLast();}queue.addLast(v);}void remove(int v) {if(v == queue.getFirst()) {queue.removeFirst();}}int getMax() {return queue.getFirst();}}
}

二、41. 缺失的第一个正数

题目链接:https://leetcode.cn/problems/first-missing-positive/description/
思路:要求时间复杂度为O(N),空间复杂度为常量级,则可以使用原地hash的方法,把原数组作为一个hash表,既然是求第一个缺失的正整数,nums从1开始铺满,假设为,len=4, nums就可以存放正整数1,2,3,4,如果有<=0的数我们就标记为len+1。然后再把小于len+1的值做为key,把对应的value给标记为负数,这样没被标记的位置就是大于4的,即为缺失的。

class Solution {public int firstMissingPositive(int[] nums) {int k = nums.length+1;for(int i = 0; i < nums.length; i++) {if(nums[i] <= 0) nums[i] = k;}for(int i = 0; i < nums.length; i++) {int t = Math.abs(nums[i]);if(t < k) {nums[t-1] = -Math.abs(nums[t-1]);}}for(int i = 0; i < nums.length; i++) {if(nums[i] > 0) return i+1;}return k;}
}

三、LCR 140. 训练计划 II

题目链接:https://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/description/
思路:求链表倒数第n个节点,典型的快慢指针。

class Solution {public ListNode trainingPlan(ListNode head, int cnt) {ListNode root = new ListNode(-1, head);ListNode slow = root, fast = root;for(int i = 0; i < cnt; i++) {fast = fast.next;}while(fast != null) {fast = fast.next;slow = slow.next;}return slow;}
}

四、322. 零钱兑换

题目链接:https://leetcode.cn/problems/coin-change/description/
思路:零钱数量无限,正序遍历,求达到总数所需的最少硬币数,定义dp[i]表示,装满 i 所需的最少硬币数,那么,动态规划的状态转移,一定是从上一个硬币位置开始的,也就是 i - coins[j],这个位置,即 dp[i - coins[j]],上一个硬币位置只要是有值的,那么就可以推导出状态转移,是dp[i]=dp[i - coins[j]] + 1,当然还得再和自身历史值进行比较,留下最小值。

class Solution {public int coinChange(int[] coins, int amount) {int[] dp = new int[amount+1];Arrays.fill(dp, Integer.MAX_VALUE);dp[0] = 0;for(int i = 0; i < coins.length; i++) {for(int j = coins[i]; j <= amount; j++) {if(dp[j-coins[i]] != Integer.MAX_VALUE) {dp[j] = Math.min(dp[j], dp[j-coins[i]]+1);}}}return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];}
}

五、76. 最小覆盖子串

题目链接:https://leetcode.cn/problems/minimum-window-substring/description/
思路:典型滑动窗口,维护好一个变量值,作为进入滑动窗口的契机,没进入时扩大右边界,进入时,缩小左边界。在扩大的过程修改契机,直到满足,在缩小的过程修改契机,同时记录最小值,直到不再满足契机。之后新的一轮又重新开始。

class Solution {public String minWindow(String s, String t) {Map<Character, Integer> window = new HashMap<>();Map<Character, Integer> need = new HashMap<>();for (char c : t.toCharArray()) {need.put(c, need.getOrDefault(c, 0) + 1);}int left = 0, right = 0, valid = 0, init = 0;int min = Integer.MAX_VALUE;while (right < s.length()) {char rc = s.charAt(right);right++;if (need.containsKey(rc)) {window.put(rc, window.getOrDefault(rc, 0) + 1);if (window.get(rc).equals(need.get(rc))) {valid++;}}while (valid == need.size()) {if (right - left < min) {min = right - left;init = left;}char lc = s.charAt(left);left++;if (need.containsKey(lc)) {if (need.get(lc).equals(window.get(lc))) {valid--;}window.put(lc, window.get(lc)-1);}}}return min == Integer.MAX_VALUE ? "" : s.substring(init, init+min);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFmpeg - 如何在Linux上安装支持CUDA的FFmpeg

FFmpeg - 如何在Linux(Ubuntu)上安装支持CUDA的FFmpeg 笔者认为现在的很多“xx教程”只讲干什么不讲为什么&#xff0c;这样即使报错了看官也不知道如何解决。 在安装过程的探索部分会记录我的整个安装过程以及报错和报错的解决办法。 在省流之一步到位的方法部分会省去安装过…

计算机色彩原理

计算机色彩原理 2.,书上没说清楚。其实百度百科说的比较清楚&#xff0c;其实1931版的色度图&#xff0c;明确表明色度图中&#xff0c;绿色&#xff0c;蓝色&#xff0c;红色都是区域&#xff0c;纯色都是一个区域。纯色分为光谱中的颜色都是纯色和光谱中不存在的&#xff0c;…

关于优化Android中RecyclerView性能

布局优化&#xff1a;使用简单的布局结构&#xff0c;避免复杂的嵌套布局&#xff0c;以减少渲染时间和资源消耗。推荐使用ConstraintLayout等高效的布局管理器。使用<merge>标签合并布局文件&#xff0c;减少布局层级。 减少绘制&#xff1a;通过使用setHasFixedSize(t…

JavaScript PAT乙级题解 1055 集体照

拍集体照时队形很重要&#xff0c;这里对给定的 N 个人 K 排的队形设计排队规则如下&#xff1a; 每排人数为 N/K&#xff08;向下取整&#xff09;&#xff0c;多出来的人全部站在最后一排&#xff1b; 后排所有人的个子都不比前排任何人矮&#xff1b; 每排中最高者站中间&…

机器学习(五) -- 监督学习(3) -- 朴素贝叶斯

系列文章目录及链接 目录 前言 一、朴素贝叶斯通俗理解及定义 二、原理理解及公式 1、概率基础 2、贝叶斯公式 3、拉普拉斯平滑系数 三、**算法实现 四、接口实现 1、新闻数据集介绍 2、API 3、流程 3.1、获取数据 3.2、数据预处理 3.3、特征工程 3.4、朴素贝叶…

Java Math类

Math常用的API 代码 System.out.println(Math.abs(-12)); // 12 绝对值System.out.println(Math.ceil(12.3)); // 13.0 向上取整System.out.println(Math.floor(12.3)); // 12.0 向下取整System.out.println(Math.max(12, 13)); // 13 最大值System.out.println(Math.min(12, 1…

golang mutex

1.sync.Mutex互斥锁底层实现 2.sync.RwMutex读写锁底层实现 1.sync.Mutex互斥锁底层实现 通过cas原子操作加锁&#xff0c;通过信号量实现协程唤醒 锁有两种模式&#xff0c;正常模式和饥饿模式 正常模式(非公平锁)&#xff1a;所有阻塞在等待队列的go协程会按顺序获取锁&…

顺序表的应用之通讯录

学习了顺序表之后&#xff0c;我们也得知道它的实际用途吧&#xff01;所以&#xff0c;我们今天来学习一下通讯录的实现。 typedef struct personInfo SLDataType; contact.h #define NAME_MAX 20 #define GENDER_MAX 20 #define GTEL_MAX 20 #define ADDR_MAX 100 #include&…

嵌入式中基于QT的开源串口调试工具

大家好,今天分享一个基于QT设计串口调试工具,源码在Gitee,代码简单,可操作性强! https://gitee.com/ErichMoonan/serial-master1、概述 在开始软件设计之前,我们来简略地分析一下这样一个小软件其要包含的主要内容有哪些。我们认为软件需要如下几个方面的内容: 串口参…

使用阿里云试用Elasticsearch学习:2.1 深入搜索——结构化搜索

结构化搜索&#xff08;Structured search&#xff09; 是指有关探询那些具有内在结构数据的过程。比如日期、时间和数字都是结构化的&#xff1a;它们有精确的格式&#xff0c;我们可以对这些格式进行逻辑操作。比较常见的操作包括比较数字或时间的范围&#xff0c;或判定两个…

jetlinks

学习笔记 设备消息协议解析SDK 平台封装了网络通信,但是具体的数据由消息协议进行解析.协议(ProtocolSupport)主要由认证器(Authenticator), 消息编解码器(DeviceMessageCodec),消息发送拦截器(DeviceMessageSenderInterceptor)以及配置元数据(ConfigMetadata)组成. 2. demo里…

Java Web这一路走来

大部分Java应用都是Web或网络应用&#xff0c;MVC框架在Java框架中有着举足轻重的地位&#xff0c;一开始的Web应用并不现在这样子的&#xff0c;一步一步走来&#xff0c;每一步都经历了无数的血和泪的教训&#xff0c;以史为镜可以知兴替。 1. 草莽时代 早期的Java服务端技…

Flutter开发之图片选择器

使用FLutter开发了一个图片选择的组件&#xff0c;功能如下&#xff1a; 1、支持设置最大可选图片的个数&#xff1b; 2、根据选择的图片个数自适应容器组件的高度&#xff1b; 3、可设置容器的最大高度&#xff1b; 4、支持点击放大和删除功能&#xff1b; 具体效果如下 …

【代码随想录算法训练营第四十六天 | LeetCode139.单词拆分】

代码随想录算法训练营第四十六天 | LeetCode139.单词拆分 一、139.单词拆分 解题代码C&#xff1a; class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vecto…

HarmonyOS4.0 ArkTS基本语法

一、项目目录结构 二、HelloWorld 当我们创建一个新的page时&#xff0c;IDE会给我们生成一个HelloWorld的模板 新建page 开启预览器 三、ArkTS基本组成 装饰器&#xff1a; 用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。如上述示例中Entry、Component…

软考113-上午题-【计算机网络】-IPv6、无线网络、Windows命令

一、IPv6 IPv6 具有长达 128 位的地址空间&#xff0c;可以彻底解决 IPv4 地址不足的问题。由于 IPv4 地址是32 位二进制&#xff0c;所能表示的IP 地址个数为 2^32 4 294 967 29640 亿&#xff0c;因而在因特网上约有 40亿个P 地址。 由 32 位的IPv4 升级至 128 位的IPv6&am…

LeetCode 216. 组合总和 III

解题思路 dfs,和全排列的写法类似。 相关代码 class Solution {int a[] new int[9];List<Integer> path new ArrayList<>();boolean st[] new boolean[10];List<List<Integer>> res new ArrayList<>();public List<List<Integer>…

Samba实现windows和Linux共享文件,环境搭建

​ 搭建步骤 安装sambad sudo apt-get install samba samba-common 创建samba用户和密码 此处使用 Linux 账号和密码作为 samba 的账号和密码。Linux 账号为 shelmean shelmeanmachine:[~] $ sudo smbpasswd -a shelmean New SMB password: Retype new SMB password: Add…

【算法】环形链表

题目 给定一个链表&#xff0c;判断链表中是否有环&#xff0c;并返回结果。 原理 遍历 声明一个Set&#xff0c;遍历链表放入Set&#xff0c;如果放入失败&#xff0c;说明有环。 双指针 声明一个快指针和一个慢指针&#xff0c;快指针每次移动两步&#xff0c;慢指针移…

从唯一序列码、单例模式到集群的思考

唯一序列码 在做实际业务开发中&#xff0c;不定时需要用到序列号的生成&#xff0c;要求为唯一序列码。 在实际的实现过程中&#xff0c;我常用的是两种方式&#xff1a;1、数据库自增序列&#xff1b;2&#xff1a;uuid. 如果是采用了mysql数据库&#xff0c;使用自带的数…