数组06-滑动窗口

news2024/11/27 21:48:57

目录

LeetCode——209. 长度最小的子数组

分析:

LeetCode——844. 比较含退格的字符串

分析:


LeetCode——209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target

找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

  • 1 <= target <= 109

  • 1 <= nums.length <= 105

  • 1 <= nums[i] <= 105

分析:

解法一:暴力破解 嵌套循环递归更新最小子数组长度。

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length;
        int res = Integer.MAX_VALUE;
        for (int i = 0; i < n; i++) {
            int sum = 0;
            for (int j = i; j < n; j++) {
                sum += nums[j];
                if (sum >= target) {
                    res = Math.min(res, j - i + 1);
                    break;
                }
            }
        }
        return res == Integer.MAX_VALUE ? 0 : res;
    }
}
  • 时间复杂度:O(n^2)

  • 空间复杂度:O(1)

意料之中的超时了...

解法二:双指针中的滑动窗口 适用于求子串长度的场景。

滑动窗口:定义一个start指针和end指针表示长度为end-start+1的窗口,起始位置都为0.

随着end向右滑动,获得第一个满足要求的窗口sum>=target,记录比较窗口长度取较小的值。

此时需要移动start指针,直到窗口内的元素不满足sum>target。

进行迭代,直到end指针指向数组最后一位。

Code

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int res = Integer.MAX_VALUE;
        int l = 0;
        int r = 0;
        int sum = 0;
        while (r < nums.length) {
            sum += nums[r];
            while (sum >= target) {
                res = Math.min(res, r - l + 1);
                sum -= nums[l];
                l++;
            }
            r++;
        }
        return res == Integer.MAX_VALUE? 0 : res;
    }
}
  • 时间复杂度:O(n)

  • 空间复杂度:O(1)

LeetCode——844. 比较含退格的字符串

给定 st 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true# 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。

示例 1:

输入:s = "ab#c", t = "ad#c"
输出:true
解释:s 和 t 都会变成 "ac"。

示例 2:

输入:s = "ab##", t = "c#d#"
输出:true
解释:s 和 t 都会变成 ""。

示例 3:

输入:s = "a#c", t = "b"
输出:false
解释:s 会变成 "c",但 t 仍然是 "b"。

提示:

  • 1 <= s.length, t.length <= 200

  • st 只含有小写字母以及字符 '#'

分析:

解法一:重构字符串 最容易想到的,根据规则重构字符串然后比较。

class Solution {
    public boolean backspaceCompare(String s, String t) {
        return getStr(s).equals(getStr(t));
    }
    public static String getStr(String s) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '#') {
                if (stringBuilder.length()>0) {
                   stringBuilder.deleteCharAt(stringBuilder.length()-1);
                }
                continue;
            } else {
                stringBuilder.append(s.charAt(i));
            }
        }
        return stringBuilder.toString();
    }
}
  • 时间复杂度:O(N+M)

  • 空间复杂度:O(N+M)

解法二:双指针 #只会消除前面的字符串,不影响后面的,从末尾开始查找第一个有效的字符逐个比较。

class Solution {
    public boolean backspaceCompare(String S, String T) {
        int i = S.length() - 1, j = T.length() - 1;
        int skipS = 0, skipT = 0;
​
        while (i >= 0 || j >= 0) {
            while (i >= 0) {
                if (S.charAt(i) == '#') {
                    skipS++;
                    i--;
                } else if (skipS > 0) {
                    skipS--;
                    i--;
                } else {
                    break;
                }
            }
            while (j >= 0) {
                if (T.charAt(j) == '#') {
                    skipT++;
                    j--;
                } else if (skipT > 0) {
                    skipT--;
                    j--;
                } else {
                    break;
                }
            }
            if (i >= 0 && j >= 0) {
                if (S.charAt(i) != T.charAt(j)) {
                    return false;
                }
            } else {
                if (i >= 0 || j >= 0) {
                    return false;
                }
            }
            i--;
            j--;
        }
        return true;
    }
}

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

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

相关文章

Apache Doris 行列转换可以这样玩

行列转换在做报表分析时还是经常会遇到的&#xff0c;今天就说一下如何实现行列转换吧。 行列转换就是如下图所示两种展示形式的互相转换 1. 行转列 我们来看一个简单的例子&#xff0c;我们要把下面这个表的数据&#xff0c;转换成图二的样式 image-20230914151818953.png …

计算机网络补充

未分类文档 CDMA是码分多路复用技术 和CMSA不是一个东西 UPD是只确保发送 但是接收端收到之后(使用检验和校验 除了检验的部分相加 对比检验和是否相等。如果不相同就丢弃。 复用和分用是发生在上层和下层的问题。通过比如时分多路复用 频分多路复用等。TCP IP 应用层的IO多路…

Coupang新手教程,Coupang怎么收款?——站斧浏览器

coupang新手教程 韩国coupang入驻条件很简单&#xff0c;只需要你提供注册四件套就可以了&#xff1b; Coupang的经营模式呢可以说和我们国内的电商比较像&#xff1b; 前期可以做无货源模式&#xff1b;在熟悉平台一段时间后&#xff0c;可以去打造我们自己的精品店铺&…

start()方法源码分析

当我们创建好一个线程之后&#xff0c;可以调用.start()方法进行启动&#xff0c;start()方法的内部其实是调用本地的start0()方法&#xff0c; 其实Thread.java这个类中的方法在底层的Thread.c文件中都是一一对应的&#xff0c;在Thread.c中start0方法的底层调用了jvm.cpp文件…

Python机器学习实战-特征重要性分析方法(4):相关性分析(附源码和实现效果)

实现功能 计算各特征与目标变量之间的相关性。相关性越高的特征越重要。 实现代码 import pandas as pd from sklearn.datasets import load_breast_cancer import matplotlib.pyplot as pltX, y load_breast_cancer(return_X_yTrue) df pd.DataFrame(X, columnsrange(30)…

TLS/SSL(八) 基于ECC椭圆曲线的ECDH协议

一 ECC椭圆曲线的特性 ① DH密钥交换两个问题 1、计算过程含有大量的乘法,运算速度比较慢2、安全性基于大因数分解比较困难,需要比较长的密钥位数说明&#xff1a; 互联网主要使用ECDH的密钥交换协议,是基于DH密钥交换协议的升级备注&#xff1a; ECDH基于ECC椭圆曲线的原…

【咕咕送书第二期】| 计算机网络对于考研的重要性?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《粉丝福利》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言什么是计算机网络&#xff1f;01 为什么计算机专业要学计算机网络02 计算机网络对考研的重要性 …

【二叉树】——链式结构(快速掌握递归与刷题技巧)

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

通过Python爬虫代理IP快速增加博客阅读量

前言 Python爬虫代理IP可以让你快速增加博客阅读量&#xff0c;因为它可以让你绕过一些反爬虫限制。本文将分享如何使用Python爬虫代理IP&#xff0c;以及如何使用它们来获取更多的博客阅读量。 一. 什么是代理IP 代理IP是一种在网络环境下使用的IP地址&#xff0c;它可以隐藏…

Renderbus瑞云渲染现在支持3dsMax 2024了

Autodesk于今年3月份发布了最新版本的3ds Max软件&#xff0c;其中包含令人兴奋的新功能和增强功能。3ds Max 2024渲染功能暂时可与V-Ray 6.1.2和corona 10配合使用&#xff0c;直至更多渲染引擎发布更新。而您现在可以在Renderbus瑞云渲染平台使用最新版本的3ds Max 2024。 关…

MybatisPlus两表关联查询MyBatis-Plus-Join

MybatisPlus两表关联查询MyBatis-Plus-Join 介绍 首先&#xff0c;让我们先了解一下MyBatis和MyBatis-Plus。MyBatis是一个流行的Java持久层框架&#xff0c;它提供了一种简单而强大的方式来将数据库操作与Java代码进行绑定。而MyBatis-Plus是基于MyBatis的增强工具&#xff0…

【异常报错】must call Vue.use(Vuex)

这个错误应该是在创建Vuex中出现的 把你main.js中的Vue.use(Vuex)写到store中&#xff0c;这里我的store/index.js中,即完美解决 其实仔细想想也可以发现&#xff0c;import就把整个文件给引入了&#xff0c;而index.js中有创建Store的实例&#xff0c;而在这时我们还没有Vue.…

【JAVA进阶】多线程

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;JAVASE基础 前言&#xff1a; 什么是线程&#xff1f; 线程(thread)是一个程序内部的一条执行路径。 我们之前启动程序执行后&#xff0c;main方法的执行其实就是一条单独的执行路径。 public…

使用HHDBCS管理Redis

Redis是一款内存高速缓存数据库&#xff0c;可用于缓存&#xff0c;事件发布或订阅&#xff0c;高速队列等场景。 因此&#xff0c;根据需要&#xff0c;HHDBCS在主页设置了“发布窗口”及“订阅窗口”。 1 连接redis 打开HHDBCS&#xff0c;在数据库类型中选择Redis&#…

MATLAB实战 | 粮食储仓的通风控制问题

粮食储仓的通风控制问题 01、应用实战 【例1】粮食储仓的通风控制问题。在粮食储备中&#xff0c;合适的湿度是保证粮食质量的前提。一般来说&#xff0c;若粮食水分的吸收和蒸发量相等&#xff0c;这个湿度称为平衡点湿度。只有实际湿度处于平衡点湿度以下&#xff0c;粮食质…

SpringMVC-请求与相应

一、环境准备 <dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope> //确定范围避免与tomcat冲突</de…

iOS-自定义Intent及ShortCut,能通过快捷指令唤醒APP并跳转到指定页面

1.Xcode->New->File->搜索Intent 2.在新建的intent文件中中New intent 3.完善资料&#xff0c;内容可自定义 4.创建Extension&#xff0c;file -> new -> target , 选择 Intents Extension 即可 创建完成后&#xff0c;在intents文件中勾选以下target&#xff0…

独步全球:为何TikTok成为创业者的首选平台?

在当今数字时代&#xff0c;社交媒体平台的崛起已经成为了创业者们开展业务、推广产品和建立品牌的关键方式。 然而&#xff0c;在众多社交媒体平台中&#xff0c;TikTok正以惊人的速度崭露头角&#xff0c;成为越来越多创业者的首选平台。本文将深入探讨为何TikTok如此吸引创…

双指数移动平均线DEMA指标公式,减少传统均线的滞后性

双指数移动平均线DEMA由Patrick Mulloy发明的&#xff0c;对指数移动平均线EMA进行了改进&#xff0c;用于减少传统均线的滞后性&#xff0c;于1994年发表在美国金融类月刊《Technical Analysis of Stocks & Commodities》。 双指数移动平均线DEMA是通过两个指数移动平均线…

MyBatis 执行流程分析

文章目录 1. MyBatis 执行流程概述2. MyBatis 配置文件详解3. Mappers 映射器 1. MyBatis 执行流程概述 上篇文章讲到 MyBatis入门 MyBatis 的基本入门案例我们实现了通过 MyBatis 去获取数据库的数据&#xff0c;那么他的基本流程如下&#xff1a; 第一步&#xff1a;是从配置…