LeetCode算法日记 - Day 5: 长度最小的子数组、无重复字符的最长子串

LeetCode算法日记 - Day 5: 长度最小的子数组、无重复字符的最长子串

目录

1. 长度最小的子数组

1.1 题目解析

1.2 解法

1.3 代码实现

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

2.1 题目解析

2.2 解法

2.3 代码实现


1. 长度最小的子数组

209. 长度最小的子数组 - 力扣(LeetCode)

给定一个含有 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.1 题目解析

针对一段连续区间,寻找最小长度的子数组,使其元素和大于等于给定目标值(通常称为“最小子数组和”问题),利用正数相加和只能增加的单调性,使用滑动窗口方法解决。此利用单调性避免没有必要的枚举行为。虽然有两层循环,但是时间复杂度为O(N)。

1.2 解法

滑动窗口的核心是使用两个指针(左指针和右指针)动态调整窗口范围:

  • 窗口定义:窗口代表子数组,其和记为 sum。
  • 目标:找到最小长度 {min_len}
  • 关键思想
    • 移动 right 扩大窗口,增加 sum,直到 sum>=target。
    • 然后移动  缩小窗口,减少 sum,同时检查是否仍满足 sum>=target (因为移除小元素可能保留满足条件的更小子数组)。
    • 更新 min_len 为当前窗口长度 right-left+1 的最小值。
  • 为什么高效:每个元素最多被添加和移除一次,确保线性时间复杂度

以下是滑动窗口算法的具体步骤

i)初始化指针:左右指针定义从0下标开始

ii)移动右指针:将 right 位置的元素加入窗口,直到 sum>=target

iii)缩小窗口并检查:将 left 位置的元素移动出窗口,并且检查是否 sum>= target

iiii)循环 ii, iii 直到 right>=n

1.3 代码实现

class Solution { public int minSubArrayLen(int target, int[] nums) { int min_len=Integer.MAX_VALUE,n=nums.length,sum =0; for(int left =0,right=0;right<n;right++){ sum += nums[right]; while(sum >= target){ int length = right-left+1; min_len = Math.min(min_len,length); sum-=nums[left++]; } } return min_len == Integer.MAX_VALUE ?0:min_len; } }

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

3. 无重复字符的最长子串 - 力扣(LeetCode)

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

示例 1:

输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。   请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串

2.1 题目解析

本题目可以使用滑动窗口来解决,当窗口里未包含字符时增大窗口,并且记录新的最长子字符串值,当遇到已经包含的字符时,通过 while 循环直接跳过重复的元素。

i)可以看得出当窗口没有重复元素删除时,字符串长度始终是不会增加的。
ii)我们可以直接通过 while 循环快速移动并且删除重复的元素。
iii)while 循环之后再记录当前字符串长度,切记不能在 while 循环时记录长度,会陷入只有在删除重复元素时才会更新长度。

2.2 解法

i)定义变量

ii)统计 right 所指元素的数量

iii)进行判断,如果重复则通过移动 left 和 while 循环跳过重复元素

iiii)记录长度

2.3 代码实现

class Solution { public int lengthOfLongestSubstring(String ss) { int n = ss.length(),ret = 0; int[] hash = new int[128]; char[] s = ss.toCharArray(); for(int left = 0,right =0;right<n;right++){ hash[s[right]]++; while(hash[s[right]]>1){ hash[s[left++]]--; } ret = Math.max(ret,right-left+1); } return ret; } }

Read more

JDK的下载与安装教程(详细版,下载地址:官网+其它镜像)

JDK的下载与安装教程(详细版,下载地址:官网+其它镜像)

目录 1、JDK官网 2、基于JDK官网下载JDK版本 3、基于其它镜像的下载JDK版本  3.1 使用华为镜像 3.2 使用injdk镜像 4、JDK的安装 5、配置JDK的环境变量 6、ideal选择相应的JDK版本 6.1 新建项目(new project) 6.2 创建项目后,调整JDK版本 6.3通过Maven依赖来控制JDK的版本 1、JDK官网 官网地址:Java Downloads | Oracle 中国https://www.oracle.com/cn/java/technologies/downloads/#jdk17-windows 官网地址(jdk17版本之前的):https://www.oracle.

By Ne0inhk
华为OD机试双机位C卷 - 部门人力分配 (C++ & Python & JAVA & JS & GO)

华为OD机试双机位C卷 - 部门人力分配 (C++ & Python & JAVA & JS & GO)

部门人力分配 华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 部门在进行需求开发时需要进行人力安排。 当前部门需要完成 N 个需求,需求用 requirements 表述,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。 这部分需求需要在 M 个月内完成开发,进行人力安排后每个月人力时固定的。 目前要求每个月最多有2个需求开发,并且每个月需要完成的需求不能超过部门人力。 请帮助部门评估在满足需求开发进度的情况下,每个月需要的最小人力是多少? 输入描述 输入为 M 和 requirements,M 表示需求开发时间要求,requirements 表示每个需求工作量大小,N 为 requirements长度, * 1 ≤ N/2 ≤ M ≤ N ≤ 10000

By Ne0inhk

Java助力:开启旅游系统个性化畅享之旅

Java助力:开启旅游系统个性化畅享之旅 在旅游行业数字化转型的浪潮中,个性化服务已成为提升用户体验、增强竞争力的核心要素。Java凭借其强大的跨平台能力、高并发处理能力以及丰富的生态系统,成为构建个性化旅游系统的理想选择。通过整合大数据、人工智能、机器学习等技术,Java赋能的旅游系统能够精准捕捉用户需求,提供从行程规划到旅途体验的全流程个性化服务,让每一次出行都成为独一无二的畅享之旅。 一、Java技术优势:支撑个性化旅游系统的基石 1. 跨平台与可扩展性 Java“一次编写,到处运行”的特性,使旅游系统能够无缝适配Web、移动端(Android/iOS)、小程序等多终端,满足用户随时随地访问的需求。同时,Java的模块化设计和微服务架构(如Spring Cloud)支持系统灵活扩展,轻松应对高并发场景。例如,在节假日旅游高峰期,系统可通过动态扩容订单服务、推荐服务等模块,确保流畅运行。 2. 高性能与稳定性 Java的JVM优化和垃圾回收机制,结合分布式缓存(如Redis)、消息队列(如Kafka)等技术,能够高效处理海量数据,保障系统稳定性。

By Ne0inhk
【C++笔记】STL详解:String类的实现

【C++笔记】STL详解:String类的实现

前言:                 在前面的学习中,我们已经初步掌握了string类接口函数的使用方法,本文将带领大家从零开始,逐步实现一个完整的string类。          一、string类总览                 温馨提示: 为了避免与标准库中的string产生命名冲突,我们使用mystd命名空间进行封装。 namespace mystd { class string { public: //迭代器 typedef char* iterator; typedef const char* const_iterator; //默认成员函数 string(); string(const char* str); //构造函数 string(const string& s); //拷贝构造函数 string& operator=(const string& s); //赋值运算符重载函数 ~string(); //析构函数 //迭代器相关函数 iterator begin(

By Ne0inhk