day55-day56【代码随想录】二刷数组

news2024/11/16 9:22:59

文章目录

  • 前言
  • 一、字符串的排列(力扣567)【滑动窗口】
  • 二、找到字符串中所有字母异位词(力扣438)【滑动窗口】
  • 三、串联所有单词的子串(力扣30)【滑动窗口】****【hard】
  • 每日一题day55:合并相似的物品(力扣2263)
  • 每日一题day56:矩阵中的局部最大值(力扣2373)


前言

1、字符串的排列
2、找到字符串中所有字母异位词
3、串联所有单词的子串
4、每日一题
5、每日一题


一、字符串的排列(力扣567)【滑动窗口】

给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。

换句话说,s1 的排列之一是 s2 的 子串 。

在这里插入图片描述

class Solution {
    public boolean checkInclusion(String s1, String s2) {
        int left=0;
        int right=0;

        int[] need = new int[128];
        for(int i=0;i<s1.length();i++){
            need[s1.charAt(i)]++;
        }
        int count = s1.length();
        int length = s1.length();

        //滑动窗口
        while(right<s2.length()){
            //判断是否满足条件:
            if(need[s2.charAt(right)]>0){
                count--;
            }
            need[s2.charAt(right)]--;
            if(count==0){
                //缩小窗口左边界
                while(left<right && need[s2.charAt(left)]<0){
                    //说明是可以缩小窗口的
                    need[s2.charAt(left)]++;
                    left++;
                }
                //不能再缩小的时候 判断一下length
                if(right-left+1==length){
                    return true; 
                }
                need[s2.charAt(left)]++;
                left++;
                count++;
            }
            right++;
        }
        return false;
    }
}

二、找到字符串中所有字母异位词(力扣438)【滑动窗口】

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

在这里插入图片描述

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        int i=0;
        int j=0;
        //用来存放需要的元素
        int[] need = new int[128];
        for(int c=0;c<p.length();c++){
            need[p.charAt(c)]++;
        }
        int count = p.length();
        int length = p.length();

        List<Integer> res = new ArrayList<>();

        while(j<s.length()){
            //判断是否满足条件
            if(need[s.charAt(j)]>0){
                count--;
            }
            need[s.charAt(j)]--; //把右边字符加入窗口
            while(count==0){
                while(i<j && need[s.charAt(i)]<0)//压缩左窗口
                {
                    need[s.charAt(i)]++;
                    i++;
                }
                if(j-i+1==length){
                   //记录结果
                   res.add(i);
                }
                need[s.charAt(i)]++;
                i++;
                count++;
            }
            j++;
        }
        return res;
    }
}

三、串联所有单词的子串(力扣30)【滑动窗口】****【hard】

给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。

s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。

例如,如果 words = [“ab”,“cd”,“ef”], 那么 “abcdef”, “abefcd”,“cdabef”, “cdefab”,“efabcd”, 和 “efcdab” 都是串联子串。 “acdbef” 不是串联子串,因为他不是任何 words 排列的连接。
返回所有串联字串在 s 中的开始索引。你可以以 任意顺序 返回答案。
在这里插入图片描述

class Solution {
    public List<Integer> findSubstring(String s, String[] words) {
        List<Integer> res = new ArrayList<>();
        // 所有单词的个数
        int num = words.length;
        // 每个单词的长度(是相同的)
        int wordLen = words[0].length();
        // 字符串长度
        int stringLen = s.length();

        for (int i = 0; i < wordLen; i++) {
            // 遍历的长度超过了整个字符串的长度,退出循环
            if (i + num * wordLen > stringLen) {
                break;
            }
            // differ表示窗口中的单词频次和words中的单词频次之差
            Map<String, Integer> differ = new HashMap<>();
            // 初始化窗口,窗口长度为num * wordLen,依次计算窗口里每个切分的单词的频次
            for (int j = 0; j < num; j++) {
                String word = s.substring(i + j * wordLen, i + (j + 1) * wordLen);
                differ.put(word, differ.getOrDefault(word, 0) + 1);
            }
            // 遍历words中的word,对窗口里每个单词计算差值
            for (String word : words) {
                differ.put(word, differ.getOrDefault(word, 0) - 1);
                // 差值为0时,移除掉这个word
                if (differ.get(word) == 0) {
                    differ.remove(word);
                }
            }
            // 开始滑动窗口
            for (int start = i; start < stringLen - num * wordLen + 1; start += wordLen) {
                if (start != i) {
                    // 右边的单词滑进来
                    String word = s.substring(start + (num - 1) * wordLen, start + num * wordLen);
                    differ.put(word, differ.getOrDefault(word, 0) + 1);
                    if (differ.get(word) == 0) {
                        differ.remove(word);
                    }
                    // 左边的单词滑出去
                    word = s.substring(start - wordLen, start);
                    differ.put(word, differ.getOrDefault(word, 0) - 1);
                    if (differ.get(word) == 0) {
                        differ.remove(word);
                    }
                    word = s.substring(start - wordLen, start);
                }
                // 窗口匹配的单词数等于words中对应的单词数
                if (differ.isEmpty()) {
                    res.add(start);
                }
            }
        }
        return res;
    }
}

每日一题day55:合并相似的物品(力扣2263)

给你两个二维整数数组 items1 和 items2 ,表示两个物品集合。每个数组 items 有以下特质:

items[i] = [valuei, weighti] 其中 valuei 表示第 i 件物品的 价值 ,weighti 表示第 i 件物品的 重量 。
items 中每件物品的价值都是 唯一的 。
请你返回一个二维数组 ret,其中 ret[i] = [valuei, weighti], weighti 是所有价值为 valuei 物品的 重量之和 。

注意:ret 应该按价值 升序 排序后返回。

在这里插入图片描述

集合的使用

class Solution {
    public List<List<Integer>> mergeSimilarItems(int[][] items1, int[][] items2) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int[] v:items1){
            map.put(v[0],map.getOrDefault(v[0],0)+v[1]);
        }
        for(int[] v:items2){
            map.put(v[0],map.getOrDefault(v[0],0)+v[1]);
        }
        List<List<Integer>> res = new ArrayList<>();
        //获取对象的集合
        Set<Map.Entry<Integer,Integer>> entries = map.entrySet();
        for(Map.Entry<Integer,Integer> entry : entries){
            int k = entry.getKey();
            int v = entry.getValue();

            List<Integer> pair = new ArrayList<>();
            pair.add(k);
            pair.add(v);
            res.add(pair);
        }
        Collections.sort(res,(a,b)->a.get(0)-b.get(0));
        return res;
    }
}

每日一题day56:矩阵中的局部最大值(力扣2373)

给你一个大小为 n x n 的整数矩阵 grid 。
生成一个大小为 (n - 2) x (n - 2) 的整数矩阵 maxLocal ,并满足:
maxLocal[i][j] 等于 grid 中以 i + 1 行和 j + 1 列为中心的 3 x 3 矩阵中的 最大值 。
换句话说,我们希望找出 grid 中每个 3 x 3 矩阵中的最大值。
返回生成的矩阵。

class Solution {
    public int[][] largestLocal(int[][] grid) {
        int h = grid.length;  //高度
        int w = grid[0].length; //宽度

        int[][] maxLocal = new int[h-2][w-2];

        for(int i=0;i<h-2;i++){
            for(int j=0;j<w-2;j++){
                //获取i j位置的最大值 
                maxLocal[i][j] = getMax(grid,i,j);
            }
        }
        return maxLocal;
    }
    public int getMax(int[][] grid,int i,int j){
        int max = Integer.MIN_VALUE;
        for(int x=i;x<i+3;x++){
            for(int y=j;y<j+3;y++){
                max = Math.max(max,grid[x][y]);
            }
        }
        return max;
    }
}

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

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

相关文章

面试题HTML篇(一)

目录 一、meta 标签可以做什么 四、行内元素、块级元素、空元素 元素之间的转换问题&#xff1a; 五、px,em,rem,vw,vh,rpx等单位的特性 六、替换元素和非替换元素 七、first-of-type和first-child有什么区别 八、doctype标签的作用 九、link标签和import标签的区别 十…

import “cv2“ could not be resolved pylance(reportMissingImports)

openCV系列文章目录 文章目录openCV系列文章目录前言一、错误原因二、解决方法1.在vscode&#xff1a;Python:Select Interpreter2.依然报错&#xff1a;cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:1272: error: (-2:U…

InstructGPT论文精读

论文链接&#xff1a;https://arxiv.org/pdf/2203.02155.pdf 1 摘要 做的事&#xff1a; 1、标注了数据&#xff0c;问题和答案写出来&#xff0c;然后训练模型 2、收集数据集&#xff0c;排序模型的输出&#xff0c;使用强化学习训练这个排序的过程 效果层面来说&#xff1…

vant-list使用,请求接口之后会多几次load加页面(详细解释,动图演示)

页面实现效果&#xff1a;在页面中使用了van-tabs组件和van-list组件来实现页面布局和功能。问题描述&#xff1a;在第一个标签下&#xff0c;向下滚动page超过了2页之后&#xff0c;有点击tab切换标签&#xff0c;接口调用了多回。解决问题关键&#xff1a;loading和finished在…

爆文制造机!小红书热榜3个方向,告诉你选题诀窍!

我们知道&#xff0c;不论是达人创作内容&#xff0c;还是品牌制定Brief&#xff0c;都需要提前调研筛选海量信息&#xff0c;这时候如果有一个自己的内容素材库&#xff0c;就省事多啦。按照内容需求&#xff0c;我们可以按3个角度划分小红书内容素材&#xff1a;笔记类型、竞…

MyBatis的简单使用

MyBatis是一个优秀的持久型框架用于简化JDBC开发&#xff0c;JDBC的原生写法普遍都很麻烦&#xff0c;还要写原汁原味的sql语句&#xff0c;mybatis将很多东西都放到了配置文件里面然后用少量代码简化了免除了几乎所有的JDBC代码以及设定参数和获取结果集的工作。MyBatis 可以通…

使用D3绘制力导向图遇到的坑

目录1. 不同D3版本差异2. D3 V4版本绘制力导向图基本流程3. 跨域问题现象原因解决办法4. 异步赋值现象原因解决办法1. 不同D3版本差异 V3&#xff1a;通过d3.layout.force()将节点、连接线的数据转换成d3力导向图能够使用的数据结构 var force d3.layout.force().nodes(node…

哪些工具可以实现在线ps的需求

在线Photoshop有哪些工具可以选择&#xff1f;在 Adobe 的官网上就能够实现&#xff0c;很惊讶吧&#xff0c;其实 Adobe 官方推出了在线版本的 Photoshop 的&#xff0c;尽管目前还是 Beta版本&#xff0c;但其实也开放了蛮久了。编辑切换为居中添加图片注释&#xff0c;不超过…

安卓手机用WIFI无线调试adb

1、准备连接 1、首先将电脑和手机连接同一个WIFI&#xff0c;并插上数据线 2、打开电脑CMD,输入命令adb start-server开启adb服务 3、输入adb devices 查询已连接的设备 List of devices attached 505e894 device 这样代表已连接成功&#xff0c; 505e894 。 505e894是udid&…

蓝桥杯真题(JAVA)--分巧克力

题目描述儿童节那天有 K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有 NN 块巧克力&#xff0c;其中第 i块是HiWi 的方格组成的长方形。为了公平起见&#xff0c;小明需要从这 NN 块巧克力中切出 K 块巧克力分给小朋友们。切出的巧克力需要满足&…

SiC MOSFET驱动电压的分析

SiC MOSFET驱动电压的分析 tips:资料来自富昌电子&#xff0c;及各个模块数据手册。 1.常见的Vgs与Vgs(th)&#xff0c;以及对SiC MOSFET应用的影响 驱动电压Vgs和栅极电压阈值Vgs(th)关系到SiC MOSFET在应用过程中的可靠性&#xff0c;功率损耗(导通电阻)&#xff0c;以及驱…

极光笔记 | 极光PUSH服务助力企业提升抢单速度

随着硬件、软件、网络等不断发展、完善&#xff0c;互联网已经渗透到了日常生活中的方方面面&#xff0c;在直接赋能原有行业服务的同时也带来了很多新的服务模式&#xff0c;给人们日常生活带来了极大便利。例如&#xff1a;外卖、快递、跑腿等相关业务更是在我们日常生活中随…

CHAPTER 2 Web HA集群部署 - Heartbeat

Web HA集群部署 - Heartbeat1. Heartbeat 概述1.1 Heartbeat主要组成部分2. 环境依赖2.1 环境及组件软件2.2 关闭firewalld & selinux2.3 配置双机互信&#xff0c;SSH密钥登录​​2.4 同步时间&#xff08;以主节点时间为准&#xff09;2.5 配置域名解析3 安装软件3.1 安装…

你有“ChatGPT综合征”吗:想搞钱,或是失业焦虑?

最近互联网圈里有一个“顶流”&#xff0c;ChatGPT上线仅5天&#xff0c;注册用户数就突破100万&#xff0c;今年2月的月活跃用户已经突破了1亿。ChatGPT的热度有增无减&#xff0c;过不了多久&#xff0c;ChatGPT这个词就会从一线城市的写字楼席卷到农村老家的饭桌上。 互联网…

自动化测试难点案例分析,其实自动化你用错方向还不如不用

随着国内企业软件开发及测试水平的提升&#xff0c;许多企业开始尝试开展自动化测试的应用&#xff0c;以提高测试效率和测试质量。虽然在国外自动化测试工具应用已经很普遍&#xff0c;但国内许多企业对于软件自动化测试的理解还停留在表面上&#xff0c;没有深入的理解到企业…

SpringMVC的常用组件和工作流程及部分注解解析

一丶SpringMVC常用的组件 1.前端控制器DispatcherServlet 作用&#xff1a;统一处理请求和响应。除此之外还是整个流程控制的中心&#xff0c;由 DispatcherServlet 来调用其他组件&#xff0c;处理用户的请求 接收请求&#xff0c;响应结果&#xff0c;相当于转发器&#xff…

参考 Promise/A+ 规范和测试用例手写 Promise

前言 这可能是手写promise较清晰的文章之一。 由浅至深逐步分析了原生测试用例&#xff0c;以及相关Promise/A规范。阅读上推荐以疑问章节为切入重点&#xff0c;对比Promise/A规范与ECMAScript规范的内在区别与联系&#xff0c;确定怎样构建异步任务和创建promise实例。然后开…

JavaSE18-面向对象-内部类

文章目录一、局部内部类二、成员内部类三、静态内部类四、匿名内部类一、局部内部类 把类定义在方法中。对象创建格式&#xff1a;直接在定义内部类的方法中创建。如果在该方法外就不能使用该局部内部类了。应用场景&#xff1a;如果需要定义一个在方法中临时使用的类可以使用…

SpringCloud(微服务)学习篇(一)

SpringCloud(微服务)学习篇(一) 1 nacos的下载和配置 1.1 进入官网 nacos官网 1.2 点击nacos➡点击最新稳定版本 1.3 往下翻并点击nacos-server-2.2.0.zip,此时就已经开始下载了 1.4 把下载好的压缩包解压到没有中文路径的目录里面 1.5 修改application.properties文件 1.…

Testlink相关功能使用部分总结

1.首页面&#xff08;普通用户&#xff0c;测试用例创建用户的权限&#xff09; 右上角切换具体的项目&#xff1b;页面上方包含主页、用例、测试执行、测试结果&#xff1b;左侧包含测试项目管理、关键字管理、编辑测试用例、搜索测试用例、每用户创建的测试用例&#xff1b;…