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

2024-04-07 09:28

本文主要是介绍力扣爆刷第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);}
}

这篇关于力扣爆刷第113天之CodeTop100五连刷51-55的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882225

相关文章

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

代码训练营 Day26 | 47.排序II | 51. N-皇后 |

47.排序II 1.跟46题一样只不过加一个树层去重 class Solution(object):def backtracking(self,nums,path,result,used):# recursion stopif len(path) == len(nums):# collect our setresult.append(path[:])return for i in range(

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,

力扣 739. 每日温度【经典单调栈题目】

1. 题目 理解题意: 1.1. 给一个温度集合, 要返回一个对应长度的结果集合, 这个结果集合里面的元素 i 是 当前 i 位置的元素的下一个更高温度的元素的位置和当前 i 位置的距离之差, 若是当前元素不存在下一个更高温度的元素, 则这个位置用0代替; 2. 思路 本题用单调栈来求解;单调栈就适用于来求当前元素左边或者右边第一个比当前元素大或者小的元素;【单调栈:让栈中的元素保持单调

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

力扣接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2: 输入:height