秋招算法刷题7

20240410

1.接雨水

在这里插入图片描述
方法一,动态规划,时间复杂度O(n^2),空间复杂度O(n)

public int trap(int[] height) {         int n=height.length;         if(n==0){             return 0;         }         int[] leftMax=new int[n];         leftMax[0]=height[0];         for(int i=1;i<n;++i){             leftMax[i]=Math.max(leftMax[i-1],height[i]);         }         int[] rightMax=new int[n];         rightMax[n-1]=height[n-1];         for(int i=n-2;i>=0;--i){             rightMax[i]=Math.max(rightMax[i+1],height[i]);         }         int ans=0;         for(int i=0;i<n;++i){             ans+=Math.min(leftMax[i],rightMax[i])-height[i];         }         return ans;     }

方法二、栈

时间复杂度O(n),空间复杂度O(n)

public int trap(int[] height) {         int ans=0;         Deque<Integer> stack=new LinkedList<Integer>();         int n=height.length;         for(int i=0;i<n;++i){             while(!stack.isEmpty()&&height[i]>height[stack.peek()]){                 int top=stack.pop();                 if(stack.isEmpty()){                     break;                 }                 int left=stack.peek();                 int currWidth=i-left-1;                 int currHeight=Math.min(height[left],height[i])-height[top];                 ans+=currWidth*currHeight;             }             stack.push(i);         }         return ans;     }

方法三.双指针法
时间复杂度O(n),空间复杂度O(1)

public int trap(int[] height) {         int ans=0;         int left=0,right=height.length-1;         int leftMax=0,rightMax=0;         while(left<right){             leftMax=Math.max(leftMax,height[left]);             rightMax=Math.max(rightMax,height[right]);             if(height[left]<height[right]){                 ans+=leftMax-height[left];                 ++left;             }else{                 ans+=rightMax-height[right];                 --right;             }         }         return ans;     }

20240411

滑动窗口

1.无重复字符的最长子串

public int lengthOfLongestSubstring(String s) {         Set<Character> occ=new HashSet<Character>();         int n=s.length();         int rk=-1,ans=0;         for(int i=0;i<n;i++){             if(i!=0){                 occ.remove(s.charAt(i-1));             }             while(rk+1<n&&!occ.contains(s.charAt(rk+1))){                 occ.add(s.charAt(rk+1));                 ++rk;             }             ans=Math.max(ans,rk-i+1);         }         return ans;     }

时间复杂度O(n),感觉有点累死字符串匹配算法

2.找到字符串中所有字母异味词

public List<Integer> findAnagrams(String s, String p) {         int sLen=s.length(),pLen=p.length();         if(sLen<pLen){             return new ArrayList<Integer>();         }         List<Integer> ans=new ArrayList<Integer>();         int[] sCount=new int[26];         int[] pCount=new int[26];         for(int i=0;i<pLen;++i){             ++sCount[s.charAt(i)-'a'];             ++pCount[p.charAt(i)-'a'];         }         if(int i=0;i<sLen-pLen;++i){             --sCount[s.charAt(i)-'a'];             ++sCount[s.charAt(i+pLen)-'a'];              if(Arrays.equals(sCount,pCount)){                 ans.add(i+1);             }         }         return ans;     }
int sLen=s.length();    
int pLen=p.length();      
if(sLen<pLen){    
     return ans;
 }
      //建立两个数组存放字符串中字母出现的词频,并以此作为标准比较     
      int [] scount=new int[26];     
      int [] pcount=new int[26];      
      //当滑动窗口的首位在s[0]处时 (相当于放置滑动窗口进入数组)     
      for(int i=0;i<pLen;i++){        
       ++scount[s.charAt(i)-'a'];
       //记录s中前pLen个字母的词频         
       ++pcount[p.charAt(i)-'a']; 
       //记录要寻找的字符串中每个字母的词频(只用进行一次来确定)     
       }      
       //判断放置处是否有异位词     (在放置时只需判断一次)    
        if(Arrays.equals(scount,pcount)){          ans.add(0);     }         
        //开始让窗口进行滑动     
        for(int i=0;i<sLen-pLen;i++){ 
        //i是滑动前的首位         
        --scount[s.charAt(i) -'a'];       
        //将滑动前首位的词频删去         
        ++scount[s.charAt(i+pLen) -'a'];  
        //增加滑动后最后一位的词频(以此达到滑动的效果)         
         //判断滑动后处,是否有异位词         
         if(Arrays.equals(scount,pcount)){
                      ans.add(i+1);         
                      }     
                       }    
                         return ans;
                          }

560.和为K的子数组

前缀和+哈希表优化

public int subarraySum(int[] nums, int k) {
         int count=0,pre=0;
                  HashMap<Integer,Integer> mp=new HashMap<>();   
                        mp.put(0,1);      
                           for(int i=0;i<nums.length;i++){
                                        pre+=nums[i];             
                                        if(mp.containsKey(pre-k)){                 
                                        count+=mp.get(pre-k);
                                                     }             
                                                     mp.put(pre,mp.getOrDefault(pre,0)+1);         
                                                     }        
                                                      return count;  
                                                         }

20240412

239.滑动窗口最大值

https://leetcode.cn/problems/sliding-window-maximum/description/?envType=study-plan-v2&envId=top-100-liked

1.优先队列

public int[] maxSlidingWindow(int[] nums, int k) {         int n=nums.length;         PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>() {              public int compare(int[] pair1, int[] pair2) {                  return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];                          }          });          for(int i=0;i<k;++i){             pq.offer(new int[]{nums[i],i});         }         int[] ans=new int[n-k+1];         ans[0]=pq.peek()[0];         for(int i=k;i<n;++i){             pq.offer(new int[]{nums[i],i});             while(pq.peek()[1]<=i-k){                 pq.poll();             }             ans[i-k+1]=pq.peek()[0];         }         return ans;     }

2.单调队列

class MyQueue{     Deque<Integer> deque=new LinkedList<Integer>();     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();     } } public class TwoNum {     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();         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;      } }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python 海龟画图tutle螺旋线

目录 初识turtle模块 基本绘图概念 示例&#xff1a;绘制一个正方形 示例&#xff1a;绘制彩色螺旋线 附录 常用命令 其它命令 在Python编程中&#xff0c;使用turtle模块进行图形绘制是一种非常有趣和富有教育意义的活动。通过控制一个小海龟&#xff08;Turtle&#x…

RabbitMQ消息模型之Direct消息模型

Direct消息模型 * 路由模型&#xff1a; * 一个交换机可以绑定多个队列 * 生产者给交换机发送消息时&#xff0c;需要指定消息的路由键 * 消费者绑定队列到交换机时&#xff0c;需要指定所需要消费的信息的路由键 * 交换机会根据消息的路由键将消息转发到对应的队…

ModuleNotFoundError: No module named ‘llama_index.readers“解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

“We Need Structured Output”: 以用户为中心的大模型输出

发表机构&#xff1a;Google Research 这篇论文的核心是设计了一种系统&#xff0c;可以让开发者和用户对大型语言模型的输出施加结构性约束。系统的主要部分包括&#xff1a; 1. 用户界面&#xff08;GUI&#xff09;&#xff1a;允许用户通过图形界面来定义他们希望LLM遵守…

Redis中的BigKey

Redis中的BigKey 文章目录 Redis中的BigKey什么是BigKey&#xff1f;BigKey的危害找到Bigkey删除BigKey优化BigKeyBigKey对持久化的影响对AOF日志的影响对AOF重写和RDB的影响 什么是BigKey&#xff1f; 大 key 并不是指 key 的值很大&#xff0c;而是 key 对应的 value 很大。…

最新版IntelliJ IDEA 2024.1安装和配置教程 详细图文解说版安装教程

IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版 文章目录 IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版前言 第一步&#xff1a; IntelliJ IDEA 2024.1安装教程第 0 步&…

python数据结构与算法之线性表

1、线性表 是一种由n个元素&#xff08;n> 0 &#xff09;数据元素组成的有限序列&#xff0c;所包含的元素数量通常被称为表的长度 n 0 的表被称为空表&#xff0c;线性表的数据元素可以单一也可以复杂&#xff0c;可以是整数&#xff0c;字符串&#xff0c;也可以是由几…

H.265视频直播点播录像EasyPlayer.js流媒体播放器用户常见问题及解答

EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 今天我们来汇总下用户常见的几个问题及解答。 1、EasyPlayer.js播放多路H.265视…

HCIP的学习(9)

OSPF的接口网络类型 ​ OSPF的接口在某种网络类型下的工作方式。 网络类型OSPF接口的工作方式BMABroadcast&#xff1b;可以建立多个邻居关系。需要进行DR选举。hello 10S&#xff1b;dead 40S。P2PP2P&#xff1b;只能建立一个邻居关系&#xff0c;不需要进行DR选举。Hello …

【个人博客搭建】(3)添加SqlSugar ORM

1、安装sqlsugar。在models下的依赖项那右击选择管理Nuget程序包&#xff0c;输入sqlsugarcore&#xff08;因为我们用的是netcore&#xff0c;而不是net famework所以也对应sqlsugarcore&#xff09;&#xff0c;出来的第一个就是了&#xff0c;然后点击选择版本&#xff0c;一…

三斜求积术 To 海伦公式 ← 三角形面积

【知识点&#xff1a;三斜求积术】 所谓秦九韶的三斜求积术&#xff0c;即如果已知三角形的边长a&#xff0c;b&#xff0c;c&#xff0c;可求得该三角形的面积为&#xff1a; 而由三斜求积术可推得海伦公式。过程如下&#xff1a; 其中&#xff0c; 上面推导公式的 Latex 代码…

《QT实用小工具·二十六》运行时间记录

1、概述 源码放在文章末尾 运行时间记录&#xff0c;包含如下功能&#xff1a; 可以启动和停止服务&#xff0c;在需要的时候启动。 可以指定日志文件存放目录。 可以指定时间日志输出间隔。 可以单独追加一条记录到日志文件。 日志为文本格式&#xff0c;清晰明了。 软…

记一次生产环境Java堆内存溢出问题排查思路

文章目录 1. 用Visual VM 加载堆转储文件2. 用Visual VM 分析堆转储文件3. 结合分析结果,定位并解决问题 1. 用Visual VM 加载堆转储文件 先将转储文件从服务器下载下来&#xff0c;打开Visual VM&#xff0c;点击右上角的Load Snapshot&#xff0c;将这个转储文件加载到Visua…

移动开发避坑指南——内存泄漏

在日常编写代码时难免会遇到各种各样的问题和坑&#xff0c;这些问题可能会影响我们的开发效率和代码质量&#xff0c;因此我们需要不断总结和学习&#xff0c;以避免这些问题的出现。接下来我们将围绕移动开发中常见问题做出总结&#xff0c;以提高大家的开发质量。本系列文章…

外卖点餐APP开发需要哪些功能

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言&#xff1a;pythonjavanode.jsphp均支持 运行软件…

LeetCode_101(对称二叉树)

1.递归 public boolean isSymmetric(TreeNode root) {if(root null){return true;}return deepCheck(root.left,root.right);}boolean deepCheck(TreeNode left, TreeNode right){//递归的终止条件是两个节点都为空//或者两个节点中有一个为空//或者两个节点的值不相等if(lef…

RocketMQ 事件驱动:云时代的事件驱动有啥不同?

作者&#xff1a;林清山&#xff08;隆基&#xff09; 前言&#xff1a; 从初代开源消息队列崛起&#xff0c;到 PC 互联网、移动互联网爆发式发展&#xff0c;再到如今 IoT、云计算、云原生引领了新的技术趋势&#xff0c;消息中间件的发展已经走过了 30 多个年头。 目前&a…

如何应对MySQL单表数据量过大:垂直分表与水平分表策略解析

话接上回&#xff0c;单表最大数据建议两千万&#xff0c;那如果开发一个项目&#xff0c;预计注册量达到一个亿怎么办。 单表内放这么多数据&#xff0c;MYSQL底层B树的层级结构就可能会变得很高&#xff0c;磁盘io次数变多&#xff0c;性能会大幅度降低。所以考虑数据库分表…

01-Git 之快速入门操作本地仓库

https://learngitbranching.js.org/?localezh_CN在线练习git 1. Git 安装好Git以后, 先检查是否已经绑定了用户名和邮箱 git config --list1.1 为什么要使用版本控制&#xff1f; 从个人角度&#xff1a; 在做项目时&#xff0c;如果一点点去改代码会很乱&#xff0c;不利…

顺序表(C语言版)

前言&#xff1a;本篇文章我们来详细的讲解一下顺序的有关知识&#xff0c;这篇文章中博主会以C语言的方式实现顺序表。以及用顺序表去实现通讯录的代码操作。 目录 一.顺序表的概念 二.顺序表的分类 1.静态顺序表 三.动态顺序表的实现 1.顺序表的初始化 2.顺序表的尾插…