每日算法-250605

news2025/6/7 19:01:34

每日算法 - 20240605


525. 连续数组

题目描述

给定一个二进制数组 nums , 找到含有相同数量的 01 的最长连续子数组,并返回该子数组的长度。

在这里插入图片描述

思路

前缀和 + 哈希表

解题过程

核心思想是将问题巧妙地转换为寻找和为特定值的子数组问题。

  1. 转换问题:我们将数组中的 0 视为 -11 视为 1。这样,如果一个子数组中 01 的数量相等,那么这个子数组(转换后)的和就为 0。问题就变成了“找到和为0的最长连续子数组的长度”。

  2. 前缀和:我们定义 prefix[i] 为原数组从 0i-1 经过转换后的元素之和。

    • 如果子数组 nums[j...k] (转换后) 的和为 0,那么 prefix[k+1] - prefix[j] = 0,即 prefix[k+1] == prefix[j]
  3. 哈希表优化

    • 我们使用一个哈希表 map 来存储特定前缀和首次出现的索引。map 的键是前缀和的值,值是该前缀和第一次出现时的索引 i
    • 初始化时,我们放入 map.put(0, -1)。这表示和为 0 的前缀“出现”在索引 -1 处,这样做是为了方便计算当一个从索引 0 开始的子数组本身和为 0 时的长度(即 i - (-1) = i + 1)。
    • 遍历数组,计算当前的前缀和 current_prefix
      • 如果在 map 中已经存在 current_prefix,假设它之前出现的索引是 prev_index = map.get(current_prefix),那么从 prev_index + 1 到当前索引 i 的子数组(转换后)的和就是 0。其长度为 i - prev_index。我们用这个长度更新最大长度 max
      • 如果 map 中不存在 current_prefix,则将其存入 mapmap.put(current_prefix, i)。我们只记录第一次出现的位置,因为这样能保证在后续找到相同前缀和时,计算出的子数组长度是最大的。

复杂度

  • 时间复杂度: O ( N ) O(N) O(N),其中 N 是数组的长度。我们只遍历数组一次。
  • 空间复杂度: O ( N ) O(N) O(N),在最坏的情况下,哈希表可能存储 N 个不同的前缀和。

Code

class Solution {
    public int findMaxLength(int[] nums) {
        int max = 0, n = nums.length;
        Map<Integer, Integer> map = new HashMap<>(n);
        map.put(0, -1);
        int prefix = 0;
        for (int i = 0; i < n; i++) {
            prefix += (nums[i] == 0 ? -1 : 1);
            if (map.containsKey(prefix)) {
                max = Math.max(max, (i - map.get(prefix)));
            } else {
                map.put(prefix, i);
            }
        }
        return max;
    }
}

面试题 17.05. 字母与数字

题目描述

给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。返回该子数组。若存在多个最长子数组,返回最靠左的。

在这里插入图片描述

思路

前缀和 + 哈希表

这道题与上一题的思路非常相似。

解题过程

  1. 转换问题:我们将数组中的字母视为 1 (或 -1),数字视为 -1 (或 1,只要两者相反即可)。例如,字母计为 +1,数字计为 -1。如果一个子数组中字母和数字的数量相同,那么这个子数组(转换后)的和就为 0。问题就变成了“找到和为0的最长连续子数组”。

  2. 前缀和与哈希表

    • 同样使用 prefixSum 记录从数组开头到当前位置 i-1 的转换后元素之和。
    • 使用哈希表 map 存储 <前缀和, 首次出现的索引>
    • 初始化 map.put(0, -1)
    • 遍历数组,计算当前的前缀和 current_prefixSum
      • 如果 map 中已存在 current_prefixSum,设其之前出现的索引为 prev_index = map.get(current_prefixSum)。这意味着从 prev_index + 1 到当前索引 i 的子数组(转换后)的和为 0。其长度为 current_length = i - prev_index
      • 如果 current_length 大于已记录的最大长度 maxLen,则更新 maxLen 和最长子数组的起始索引 startIndex = prev_index + 1
      • 如果 map 中不存在 current_prefixSum,则将其存入 mapmap.put(current_prefixSum, i)
  3. 返回结果:根据记录的 startIndexmaxLen,从原数组中截取并返回结果。由于题目要求“若存在多个最长子数组,返回最靠左的”,我们只在第一次遇到前缀和时记录索引,并且在 current_length > maxLen 时才更新,这样自然保证了最靠左的特性。

复杂度

  • 时间复杂度: O ( N ) O(N) O(N),其中 N 是数组的长度。
  • 空间复杂度: O ( N ) O(N) O(N),哈希表可能存储 N 个不同的前缀和。

Code

class Solution {
    public String[] findLongestSubarray(String[] array) {
        int maxLen = 0, n = array.length;
        Map<Integer, Integer> map = new HashMap<>(n);
        map.put(0, -1);
        int prefix = 0, index = 0;
        for (int i = 0; i < n; i++) {
            prefix += (isNum(array[i]) ? -1 : 1);
            if (map.containsKey(prefix)) {
                int preIndex = map.get(prefix);
                if (i - preIndex > maxLen) {
                    index = preIndex + 1;
                    maxLen = i - preIndex;
                }
            } else {
                map.put(prefix, i);
            }
        }
        String[] s = new String[maxLen];
        System.arraycopy(array, index, s, 0, maxLen);
        return s;
    }

    private boolean isNum(String s) {
        return (s.charAt(0) >= '0' && s.charAt(0) <= '9');
    }
}

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

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

相关文章

分布式锁-Redisson实现

目录 本地锁的局限性 Redisson解决分布式锁问题 在分布式环境下&#xff0c;分布式锁可以保证在多个节点上的并发操作时数据的一致性和互斥性。分布式锁有多种实现方案&#xff0c;最常用的两种方案是&#xff1a;zookeeper和redis&#xff0c;本文介绍redis实现分布式锁方案…

C++学习-入门到精通【14】标准库算法

C学习-入门到精通【14】标准库算法 目录 C学习-入门到精通【14】标准库算法一、对迭代器的最低要求迭代器无效 二、算法1.fill、fill_n、generate和generate_n2.equal、mismatch和lexicographical_compare3.remove、remove_if、remove_copy和remove_copy_if4.replace、replace_…

HarmonyOS运动语音开发:如何让运动开始时的语音播报更温暖

##鸿蒙核心技术##运动开发##Core Speech Kit&#xff08;基础语音服务&#xff09;# 前言 在运动类应用中&#xff0c;语音播报功能不仅可以提升用户体验&#xff0c;还能让运动过程更加生动有趣。想象一下&#xff0c;当你准备开始运动时&#xff0c;一个温暖的声音提醒你“…

vscode使用系列之快速生成html模板

一.欢迎来到我的酒馆 vscode&#xff0c;yyds! 目录 一.欢迎来到我的酒馆二.vscode下载安装1.关于vscode你需要知道2.开始下载安装 三.vscode快速创建html模板 二.vscode下载安装 1.关于vscode你需要知道 Q&#xff1a;为什么使用vscode? A&#xff1a;使用vscode写…

网页前端开发(基础进阶4--axios)

Ajax Ajax(异步的JavaScript和XML) 。 XML是可扩展标记语言&#xff0c;本质上是一种数据格式&#xff0c;可以用来存储复杂的数据结构。 可以通过Ajax给服务器发送请求&#xff0c;并获取服务器响应的数据。 Ajax采用异步交互&#xff1a;可以在不重新加载整个页面的情况下&am…

软件安全:漏洞利用与渗透测试剖析、流程、方法、案例

在数字时代&#xff0c;软件已深度融入生活与工作的方方面面&#xff0c;从手机应用到企业核心系统&#xff0c;软件安全至关重要。而漏洞利用与渗透测试&#xff0c;作为软件安全领域中相互关联的两个关键环节&#xff0c;一个是黑客攻击的手段&#xff0c;一个是安全防护的方…

Haproxy的基础配置

1、参考文档 官方文档&#xff1a;HAProxy version 2.2.22 - Configuration Manual 运维派配置手册&#xff1a;Haproxy-基础配置详解 - 运维派 Haproxy 的配置文件haproxy.cfg由两大部分组成&#xff0c;分别是global和proxies部分。 2、haproxy global 配置 global&…

考研系列—操作系统:冲刺笔记(1-3章)

目录 第一章 计算机系统概述 1.基本概念 2.内核态和用户态 3.中断(外中断)、异常(内中断-与当前执行的) 4.系统调用 5.操作系统引导程序 2021年真题: 6.操作系统结构 大纲新增 (1)分层结构 (2)模块化 (3)外核 7.虚拟机 第二章 进程管理 1.画作业运行的顺序和甘…

Java调用大模型API实战指南

文章目录 前言调用大模型的流程概述和基本原理获取 DeepSeek 的 API keyJava 实现调用大模型 API 的Demo进阶扩展建议 前言 随着大语言模型&#xff08;如 OpenAI、DeepSeek、通义千问等&#xff09;的发展&#xff0c;我们可以很方便地用 API 接口调用这些强大的智能助手。在…

单片机0-10V电压输出电路分享

一、原理图 二、芯片介绍 GP8101是一个PWM信号转模拟信号转换器&#xff0c;相当于一个PWM信号输入&#xff0c;模拟信号输出的DAC。此 芯片可以将占空比为0%到100%的PWM信号线性转换成0-5V或者0-10V的模拟电压&#xff0c;并且输出电压 精度小于1%。GP8101M可以处理高频调制的…

大模型模型部署和暴露接口

创建环境 激活案件 安装相关依赖 conda create -n fastApi python3.10 conda activate fastApi conda install -c conda-forge fastapi uvicorn transformers pytorch pip install safetensors sentencepiece protobuf 新建文件夹 mkdir App cd App touch main.py 复制代码…

2025服装收银系统推荐:智能管理助力服装商家高效经营

在服装批发零售行业&#xff0c;一套高效的收银系统不仅能简化日常经营流程&#xff0c;还能通过数据分析帮助商家优化库存、提升销售。随着AI技术的普及&#xff0c;现代收银系统已不再局限于简单的记账功能&#xff0c;而是能提供智能选品、库存预警、精准营销等进阶服务。 …

Microsoft Copilot Studio - 尝试一下Agent

1.简单介绍 Microsoft Copilot Studio以前的名字是Power Virtual Agent(简称PVA)。Power Virutal Agent是2019年出现的&#xff0c;是低代码平台Power Platform的一部分。当时Generative AI还没有出现&#xff0c;但是基于已有的Conversation AI技术&#xff0c;即Microsoft L…

【Python 算法零基础 4.排序 ⑨ 堆排序】

目录 一、问题描述 二、算法对比 1.朴素算法 ① 数组模拟容器 ② 有序数组模拟容器 2.二叉堆 ① 二叉堆特点 ② 数组表示二叉树 ③ 堆 ④ 大顶堆 ⑤ 小顶堆 ⑥ 元素插入 ⑦ 获取堆顶 ⑧ 堆顶元素删除 三、代码分析 1.工具函数 2.调整大顶堆函数 Ⅰ、计算子节点索引 Ⅱ、找出最…

Deepseek/cherry studio中的Latex公式复制到word中

需要将Deepseek/cherry studio中公式复制到word中&#xff0c;但是deepseek输出Latex公式&#xff0c;比如以下Latex代码段&#xff0c;需要通过Mathtype翻译才能在word中编辑。 $$\begin{aligned}H_1(k1) & H_1(k) \frac{1}{A_1} \left( Q_1 u_1(k) Q_{i1} - Q_2 u_2(k…

32单片机——窗口看门狗

1、WWDG的简介 WWDG&#xff1a;Window watchdog&#xff0c;即窗口看门狗 窗口看门狗本质上是能产生系统复位信号和提前唤醒中断的递减计数器 WWDG产生复位信号的条件&#xff1a; &#xff08;1&#xff09;当递减计数器值从0x40减到0x3F时复位&#xff08;即T6位跳变到0&a…

IDEA 中 Undo Commit,Revert Commit,Drop Commit区别

一、Undo Commit 适用情况&#xff1a;代码修改完了&#xff0c;已经Commit了&#xff0c;但是还未push&#xff0c;然后发现还有地方需要修改&#xff0c;但是又不想增加一个新的Commit记录。这时可以进行Undo Commit&#xff0c;修改后再重新Commit。如果已经进行了Push&…

DAY43打卡

浙大疏锦行 kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 fruit_cnn_project/ ├─ data/ # 存放数据集&#xff08;需手动创建&#xff0c;后续放入图片&#xff09; │ ├─ train/ …

Leetcode 1892. 页面推荐Ⅱ

1.题目基本信息 1.1.题目描述 表&#xff1a; Friendship ---------------------- | Column Name | Type | ---------------------- | user1_id | int | | user2_id | int | ---------------------- (user1_id,user2_id) 是 Friendship 表的主键(具有唯一值的列的组合…

进程——环境变量及程序地址空间

目录 环境变量 概念 补充&#xff1a;命令行参数 引入 其它环境变量 理解 程序地址空间 引入 理解 虚拟地址存在意义 环境变量 概念 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。打个比方&#xff0c;就像你布置房间&#xff0c;这些参数就类…