秋招突击——7/16——复习{滑动窗口——无重复最长子串}——新作{相交链表,环形链表,滑动窗口——找到字符串中所有字母异位词}

文章目录

    • 引言
    • 模板——滑动窗口/双指针
    • 复习
      • 无重复最长子串
        • 复习实现
    • 新作
      • 相交链表
        • 个人实现
        • 参考实现
      • 环形链表
        • 个人实现
        • 参考实现——快慢指针
      • 找到字符串中所有字母的异位词
        • 个人实现
        • 参考实现
    • 总结

引言

  • 今天本来想完成指标的,但是做着做着,发现大部分做的比较舒服的题目都是通过模板做的,然后花时间去整理模板了,之前没弄懂的数组表示的链表的模板好好重新画了一下,差不多花了两个多小时。不过没有找到相关的题目。这里就暂时不贴了,这里觉得还是得按照章节来做,然后找到一个靠谱的模板,然后按照模板来刷,效率会高很多!
  • 这里算是又走了一个弯路吧!真的是!好吧!
  • 今天就做两题,不然没有时间去完成我的项目了!得调整一下,保证项目的事件不能改变!

模板——滑动窗口/双指针

  • 这类问题主要针对以下两种情况
    • 对于一个序列,用两个指针维护一段区间
    • 对于俩个序列,维护某种次序
  • 使用for循环同时定义一个双指针
for(int r = 0,l = 0;r <n;r ++)
{
	while(l < r && check(l,r))	l ++;
	}
}

复习

无重复最长子串

  • 这道题已经做了好几遍了。
  • 第一次练习
  • 第二次练习
  • 第三次练习
  • 题目链接
复习实现
class Solution {
    public int lengthOfLongestSubstring(String s) {
       
       // define the hashmap to remove duplication
       Map<Character,Integer> map = new HashMap<>();
       
       // traverse the string with the windows
       int res = 0;
       for(int l = 0,r = 0;r < s.length();r ++){
            char rChar = s.charAt(r);
            map.put(rChar,map.getOrDefault(rChar,0) + 1);
           
            // move the r 
            while(map.getOrDefault(rChar,0) > 1){
                char lChar = s.charAt(l);
                System.out.println(map.get(lChar));
                map.put(lChar,map.get(lChar) - 1);
                l ++;
            }
            res = Math.max(res,r- l + 1);
       }

       return res;
    }
}

在这里插入图片描述

新作

相交链表

题目链接

在这里插入图片描述

个人实现
  • 就是一个哈希表的问题
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        // define the map to store the node of the headA
        ListNode ADummy = headA;
        ListNode BDummy = headB;
        Map<ListNode,Boolean> map = new HashMap<>();

        // traverse the List A
        while(ADummy != null){
            map.put(ADummy,true);
            ADummy = ADummy.next;
        }

        // judge whether contains
        while(BDummy != null){
            if(map.containsKey(BDummy)) return BDummy;
            BDummy = BDummy.next;
        }

        return null;
    }
}

在这里插入图片描述
感觉的我的时间复杂度不是O(1),时间复杂度是O(m + n)

参考实现
  • 太牛了,我一看没有环,就没有想过使用双指针进行遍历,如果使用交叉的双指针,确实能够在O(1)的空间复杂度内解决问题。
  • 下面的证明太精彩了,有点累了,刷算法刷疲惫了!就不推导了,直接复制了!
    在这里插入图片描述
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA == null || headB == null)  return null;

        // define the map to store the node of the headA
        ListNode ADummy = headA;
        ListNode BDummy = headB;

        // traverse the List 
        while(ADummy != BDummy){
            ADummy = (ADummy == null ? headB : ADummy.next);
            BDummy = (BDummy == null ? headA : BDummy.next);

        }

        return ADummy;
    }
}

在这里插入图片描述

环形链表

题目链接
在这里插入图片描述

个人实现

使用hash表,重复包含就算是重合了,对象在堆中是唯一的

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        Map<ListNode , Boolean> map = new HashMap<>();
        ListNode temp = head;
        while(temp != null){
            if(map.containsKey(temp))   return true;
            map.put(temp,true);
            temp = temp.next;
        }
        return false;

    }
}

在这里插入图片描述

参考实现——快慢指针
  • 这里使用一个快慢指针重合的方式
    • 快指针一次遍历两个节点
    • 慢指针一次遍历一个节点
  • 两个指针重合,说明出现了环,没有环,有一个会为空
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        // define first and slow pointer to traverse the list
        if(head == null || head.next == null)    return false;  
        ListNode f = head.next;
        ListNode s = head;
        while(f != null && s != null){
            // judge whether s == f
            if(s == f)  return true;
            
            f = f.next;
            if(f == null )  return false;
            f = f.next;
            s = s.next;
        }

        return false;
    }
}

在这里插入图片描述
下面是参考他的代码写的,原来的代码有点问题,因为没有考虑到会有为空的情况出现

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        // define first and slow pointer to traverse the list
        if(head == null || head.next == null)    return false;  
        ListNode f = head.next;
        ListNode s = head;
        while(f != s){
            // judge whether s == f
            if(s == null || f == null)  return false;
            f = f.next;
            if(f == null )  return false;
            f = f.next;
            s = s.next;
        }

        return true;
    }
}

找到字符串中所有字母的异位词

  • 题目链接

在这里插入图片描述
注意

  • 会出现仅仅包含一个字符的情况,需要特殊考虑
个人实现
  • 这道题我应该会创建两个字典,分别对应p和s
    • 对应p的字典,用来比较目标字符串中应该有哪些字符
    • 对应s的字典,用来对各个字符的情况进行计数,保证每一个字符都是符合p中的字典数量。
  • 处理步骤
    • 如果当前字符不在需要匹配的字符串中的,直接移动l和r,并且清空字典
    • 判定出现次数已经超过了或者重复出现了,那就移动l,直到满足要求的
class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        // define the result 
        List<Integer> res = new ArrayList<>();
        
        // define two maps of p and s
        Map<Character ,Integer> pMap = new HashMap<>();
        Map<Character ,Integer> sMap = new HashMap<>();

        // reaverse p string as goal to compare
        for(int i = 0;i < p.length();i ++)   pMap.put(p.charAt(i),pMap.getOrDefault(p.charAt(i),0) + 1 );

        // traverse the string s
        for(int l = 0, r = 0;r < s.length();r ++){
            // put rChar to the map
            char rChar = s.charAt(r);
            if(!pMap.containsKey(rChar))    {
                l = r + 1;
                sMap.clear();
                continue;
            }

            sMap.put(rChar,sMap.getOrDefault(rChar,0) + 1);

            // control num of the r
            while(sMap.getOrDefault(rChar , 0 ) > pMap.getOrDefault(rChar , 0 )) {
            
                char lChar = s.charAt(l);
                int num = sMap.get(lChar) - 1;
                if(num == 0) sMap.remove(lChar);
                else sMap.put(lChar,num);
                l ++;
            }

            // compare the legnth and content of the map to cal the res
            int len = r - l + 1;
            if(sMap.size() == pMap.size() && len == p.length()){
                res.add(l);
            }
        }

        return res;

    }
}

在这里插入图片描述

参考实现
  • 他的颗粒度更高,不像我是匹配每一个字母类型,他是以满足要求的字母类型数作为判定的标准,然后需要匹配的快。
  • 同时共用一个map,正数表示需要匹配的字符串,负数表示待匹配的字符串中匹配到的字符串,需要最终为零,才是满足条件。
class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        // define the result 
        List<Integer> res = new ArrayList<>();
        
        // define two maps of p and s
        Map<Character ,Integer> pMap = new HashMap<>();
        // reaverse p string as goal to compare
        for(int i = 0;i < p.length();i ++)   pMap.put(p.charAt(i),pMap.getOrDefault(p.charAt(i),0) + 1 );

        // traverse the string s
        int tot = pMap.size();
        for(int l = 0, r = 0,satisfy = 0;r < s.length();r ++){
           // put the rChar into map and cal the number of the types in the string 
           char rChar = s.charAt(r);
           pMap.put(rChar,pMap.getOrDefault(rChar,0)  - 1);
           if(pMap.get(rChar) == 0) satisfy ++;

           // move l to meet the required len of p
           while(r - l + 1 > p.length()){
                char lChar = s.charAt(l);
                if(pMap.get(lChar) == 0)    satisfy --;
                pMap.put(lChar,pMap.getOrDefault(lChar,0)  + 1);
                l ++;
           }

           if(satisfy == tot)   res.add(l);
        }

        return res;

    }
}

在这里插入图片描述
总的来说,这个算法相当于是优化版的滑动窗口,效果会更好的

总结

  • 今天看了滑动窗口和两个关于链表的简单题,关于滑动窗口,大概框架能够写出来,然后就是条件的思考判定。关于链表的题目虽然简单,但是使用双指针的两个思路真的棒!
  • 今天又花了很多时间在算法上,不能在浪费这么多时间了!
  • 总结了一下,有模板可以给我一个大概的思维框架,保证我能写出来,可能不够灵活的,方法不一定是最有效的,但是一定能够写出来!
  • 后续应该抓紧看我的项目了,准备投提前批了,能过就行了,!

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

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

相关文章

Day07-ES集群加密,kibana的RBAC实战,zookeeper集群搭建,zookeeper基本管理及kafka单点部署实战

Day07-ES集群加密&#xff0c;kibana的RBAC实战&#xff0c;zookeeper集群搭建&#xff0c;zookeeper基本管理及kafka单点部署实战 0、昨日内容回顾:1、基于nginx的反向代理控制访问kibana2、配置ES集群TSL认证:3、配置kibana连接ES集群4、配置filebeat连接ES集群5、配置logsta…

用go实现限流算法

文章目录 固定窗口优缺点&#xff1a;适用场景&#xff1a;总结&#xff1a; 滑动窗口优缺点&#xff1a;适用场景&#xff1a;总结&#xff1a; 漏桶限流器优缺点&#xff1a;适用场景&#xff1a;总结&#xff1a; 令牌桶优缺点&#xff1a;适用场景&#xff1a;总结&#xf…

保障低压设备安全!中国星坤连接器精密工艺解析!

在现代电子设备中&#xff0c;连接器扮演着至关重要的角色&#xff0c;它们是电子系统之间沟通的桥梁。随着技术的发展&#xff0c;对连接器的需求也在不断提升&#xff0c;特别是在低电压应用领域。中国星坤最新推出的低压连接器&#xff0c;以其精密性和安全性&#xff0c;为…

AI算法18-最小角回归算法Least Angle Regression | LARS

​​​ 最小角回归算法简介 最小角回归&#xff08;Least Angle Regression, LAR&#xff09;是一种用于回归分析的统计方法&#xff0c;它在某些方面类似于最小二乘回归&#xff0c;但提供了一些额外的优点。最小角回归由Bradley Efron等人提出&#xff0c;主要用于处理具有…

10.1 标注、注记图层和注记整体说明

文章目录 前言标注、注记图层和注记QGis中的标注QGis中的注释(Annotation)图层QGis中的注记 总结 前言 介绍标注、注记图层和注记说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 标注、注记图层和注记 有时地图需要使用一些文字信息说明其中的地理要素或其…

如何用一个例子向10岁小孩解释高并发实时服务的单线程事件循环架构

I/O密集型进程和CPU密集型进程 聊天应用程序、MMO&#xff08;大型多人在线&#xff09;游戏、金融交易系统、等实时服务需要处理大量并发流量和实时数据。 这些服务是I/O密集型的&#xff0c;因为它们花费大量资源处理输入输出操作&#xff0c;例如高吞吐量、低延迟网络通信…

泉盛UV-K5扩容2Mbit EEPROM

泉盛UV-K5扩容2Mbit EEPROM 步骤 分离前面板与背板。 拆下电池&#xff0c;底部有个空隙&#xff0c;从缝隙撬开背板。分离前面板时注意喇叭连接线&#xff0c;不要扯断了。 分离屏幕。 先从箭头位置向上挑起&#xff0c;屏幕稍微松动即可左右晃动&#xff0c;直至完全取出。注…

leetcode日记(40)N皇后

一开始没看到不能同斜线&#xff0c;以为只要不同行不同列就行&#xff0c;本来想先列出每一行的Q都不同位置的棋盘然后进行排列组合就行&#xff0c;后来才发现还有限制&#xff08;后来又想了一下&#xff0c;感觉可以先用这种思路然后去除有同一斜线的棋盘摆列&#xff09; …

【手写数据库内核组件】0501多线程并发模型,任务分发多工作者执行架构实现,多线程读写状态时volatile存储类型使用技巧

0501 多线程管理 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 文章目录 0501 多…

2024年金航标和萨科微扩张

近年电子信息产业链的外迁和世界经济的低迷&#xff0c;各行各业都很卷&#xff0c;加班加点但业绩负增长是常态&#xff0c;互联网大厂阿里巴巴大裁员、字节跳动裁到了大动脉、京东刘强东抛弃躺平的兄弟、深圳华强北做电子元器件的老板老板娘们一脸茫然&#xff0c;周围都弥漫…

使用工作日志 - 更快地恢复专注并理清思路

原文&#xff1a;Charles Fval - 2024.07.12 你正在处理计算机科学中最复杂的问题&#xff1a;修复部署管道上的权限。这已经是你开始处理这个简单任务的第 4 天了。你的经理明确告诉你&#xff0c;你在这方面的表现远低于她对一个中期实习生的期望。你的同事们都尽量远离你&a…

华为OD 机试真题 - 分割均衡字符串(Python)

题目描述 均衡串定义:字符串只包含两种字符&#xff0c;且两种字符的个数相同。 给定一个均衡字符串&#xff0c;请给出可分割成新的均衡子串的最大个数。 约定字符串中只包含大写的’X"和’Y’两种字符。 输入描述 均衡串:XXYYXY 字符串的长度[2,10000]。给定的字符…

南京邮电大学统计学课程实验2 用EXCEL进行参数估计假设检验 指导

一、实验描述 实验目的 1、学会用Excel进行参数估计&#xff1b; 2、学会用Excel进行z检验-双样本平均差检验&#xff1b; 实验环境 实验中使用以下软件和硬件设备 &#xff08;1&#xff09;Windows XP操作系统&#xff1b; &#xff08;2&#xff09;PC机、EXCEL软件&…

[Vulnhub] digitalworld.local-JOY snmp+ProFTPD权限提升

信息收集 IP AddressOpening Ports192.168.101.150TCP:21,22,25,80,110,139,143,445,465,587,993,995 $ nmap -p- 192.168.101.150 --21,22,25,min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp ProFTPD | ftp-anon: Anonymous FTP logi…

Python 面向对象编程,创建类和对象

面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称 OOP&#xff09;是一种程序设计范式&#xff0c;旨在提高软件的可维护性、可扩展性和复用性。OOP 的核心思想是将数据和操作这些数据的代码封装在一起&#xff0c;通过类和对象来组织程序&#xff0c;使程…

Windows系统中MySQL的安装和卸载(详细包含msi和zip下载方式,以及完全卸载方法,易出现问题及解决方案等)

MySQL的安装: 第一种:msi安装(交简单,但是不能自定义安装路径) 下载地址:https://dev.mysql.com/downloads/installer/ 选择历史版本 选择安装版本,这里我选择的是8.0.37的版本,然后点击Download下载离线安装包 如下图即为下载好的版本,双击打开安装 出现如下情况,…

vue3中基于dayjs实现日历

import dayjs from dayjs export const useCreateCander () > {let calendarDay []// 当前年&#xff0c;去年&#xff0c;明年let year dayjs().year()let prvYear year - 1let nextYear year 1// 当前月、上月、下月let month dayjs().month() 1let prvMonth mon…

CentOS 7 Web面板的文件管理器说明

在使用CentOS 7 Web Panel&#xff08;CWP7&#xff09;时&#xff0c;偶尔要求在服务器曲面上修改&#xff0c;创建&#xff0c;编辑或删除文件。 最简单&#xff0c;最直接的方式是通过利用CWP7的内置文件管理器。 本文将详细介绍如何启动它&#xff0c;使用它&#xff0c;以…

c++信号和槽机制的轻量级实现,sigslot 库介绍及使用

Qt中的信号与槽机制很好用&#xff0c;然而只在Qt环境中。在现代 C 编程中&#xff0c;对象间的通信是一个核心问题。为了解决这个问题&#xff0c;许多库提供了信号和槽&#xff08;Signals and Slots&#xff09;机制。今天推荐分享一个轻量级的实现&#xff1a;sigslot 库。…

基于LSTM及其变体的回归预测

1 所用模型 代码中用到了以下模型&#xff1a; 1. LSTM&#xff08;Long Short-Term Memory&#xff09;&#xff1a;长短时记忆网络&#xff0c;是一种特殊的RNN&#xff08;循环神经网络&#xff09;&#xff0c;能够解决传统RNN在处理长序列时出现的梯度消失或爆炸的问题。L…