每日算法-250529

article/2025/9/6 21:42:24

2909. 元素和最小的山形三元组 II

题目
题目截图1

思路

数组, 前后缀分解

解题过程

对于寻找满足特定条件的三元组 (nums[i], nums[j], nums[k])i < j < k 的问题,一个常见的思路是枚举中间元素 nums[j]

  1. 确定目标:我们要找的是和最小的 “山形三元组”,即 nums[i] < nums[j]nums[k] < nums[j]
  2. 枚举 nums[j]:当 j1 遍历到 n-2 (其中 n 是数组长度),我们需要快速找到 nums[j] 左侧的最小值 (prevMin) 和右侧的最小值 (suffixMinVal)。
  3. 左侧最小值:对于 nums[j] 左侧 [0, j-1] 区间的最小值,我们可以在遍历 nums[j] 的同时,用一个变量 prevMin 动态维护 nums[0...j-1] 的最小值。
  4. 右侧最小值:对于 nums[j] 右侧 [j+1, n-1] 区间的最小值,我们可以预处理一个后缀最小值数组 suffixMinsuffixMin[x] 表示 nums[x...n-1] 区间的最小值。这样,对于当前的 nums[j], 右侧的最小值就是 suffixMin[j+1]
  5. 判断与更新:当确定了 prevMinsuffixMin[j+1] 后,如果 prevMin < nums[j]nums[j] > suffixMin[j+1],说明找到了一个山形三元组。我们计算其和 prevMin + nums[j] + suffixMin[j+1],并用它来更新全局的最小和结果 ret
  6. 初始化与边界ret 初始化为 Integer.MAX_VALUE。如果遍历结束后 ret 仍为此初始值,说明不存在山形三元组,返回 -1。

复杂度

  • 时间复杂度: O ( N ) O(N) O(N)
    • 预处理 suffixMin 数组需要 O ( N ) O(N) O(N)
    • 主循环遍历 nums[j] 需要 O ( N ) O(N) O(N)
    • 总体为 O ( N ) + O ( N ) = O ( N ) O(N) + O(N) = O(N) O(N)+O(N)=O(N)
  • 空间复杂度: O ( N ) O(N) O(N)
    • 需要 suffixMin 数组存储后缀最小值,空间为 O ( N ) O(N) O(N)

Code

class Solution {public int minimumSum(int[] nums) {int ret = Integer.MAX_VALUE;int n = nums.length;int[] suffixMin = new int[n];suffixMin[n - 1] = nums[n - 1];for (int i = n - 2; i >= 0; i--) {suffixMin[i] = Math.min(suffixMin[i + 1], nums[i]);}int prevMin = nums[0];for (int j = 1; j < n - 1; j++) {if (prevMin < nums[j] && nums[j] > suffixMin[j + 1]) {ret = Math.min(ret, (prevMin + nums[j] + suffixMin[j + 1]));}prevMin = Math.min(prevMin, nums[j]);}return ret == Integer.MAX_VALUE ? -1 : ret;}
}

1930. 长度为 3 的不同回文子序列

题目
题目截图2

思路

数组, 哈希表/计数

解题过程

一个长度为 3 的回文子序列形如 s[i]...s[j]...s[k] 变成 xyx,其中 s[i] == s[k]i < j < k
我们的目标是统计这种 xyx 形式的不同字符串的个数。

  1. 枚举外层字符:我们可以枚举构成回文的第一个字符 s[i] 和第三个字符 s[k]
  2. 字符频次预处理 (globalMap):首先,统计原字符串 s 中每个字符的出现次数,存储在 globalMap
  3. 外层循环 i:遍历 i0n-3 (作为第一个字符 s[i] 的索引)。
    • 剪枝:如果 globalMap[s[i] - 'a'] <= 1,说明字符 s[i] 在整个字符串中只出现了一次或零次,不可能作为回文的两端,直接跳过。
  4. 内层循环 k:对于每个 s[i],从字符串末尾 n-1 向前遍历 ki+1 (作为第三个字符 s[k] 的索引)。
    • 寻找匹配的 s[k]:当找到一个 s[k] == s[i] 时,我们就确定了回文的两个外层字符。
  5. 中层字符统计:在索引 ik 之间 (即 i+1k-1),我们需要找到所有不同的字符 s[j]
    • 使用一个局部的 map (大小为26的数组) 来记录在 (i, k) 区间内出现的不同字符。
    • 遍历 ji+1k-1。如果 s[j] 在这个 map 中是第一次出现 (即 map[s[j] - 'a'] < 1),则说明 s[i]s[j]s[k] 是一个新的回文子序列,ret 增加 1。
    • 同时,用 alike 记录在 (i, k) 区间内与 s[i] (或 s[k]) 相同的字符数量。
  6. 优化 (globalMap 更新与 break)
    • 一旦为当前的 s[i] 找到了最靠右的匹配 s[k] 并统计了中间的字符,我们就认为与这个 s[i](在当前索引 i 处的)相关的、以 s[k](在当前索引 k 处的)为结尾的回文都已经统计完毕。
    • 为了避免重复计算(特别是当 s[i] 字符在后续的 i 中再次出现时),我们从 globalMap 中减去已处理的字符:globalMap[s[i] - 'a'] -= (2 + alike)。这里的 2 代表 s[i]s[k]alike 代表中间与 s[i] 相同的字符。这是一种尝试性的优化,旨在减少后续迭代中对相同字符模式的重复探索。
    • 然后 break 内层 k 的循环,因为对于当前的 s[i],我们只关心它与最右边的 s[k] 形成的组合。
  7. 返回 ret

复杂度

  • 时间复杂度: O ( N 3 ) O(N^3) O(N3)
    • 外层 i 循环 N N N 次。
    • 内层 k 循环最坏情况下 N N N 次。
    • 中层 j 循环最坏情况下 N N N 次。
    • globalMap 的更新和 map 操作是 O ( 1 ) O(1) O(1) (因为字母表大小固定为26)。
    • 虽然 globalMap 的更新和 break 提供了一些剪枝,但最坏情况(例如字符串由许多不同字符组成,每个字符恰好出现两次)可能导致接近 O ( N 3 ) O(N^3) O(N3) 的行为。
  • 空间复杂度: O ( N ) O(N) O(N)
    • char[] s 占用 O ( N ) O(N) O(N)
    • globalMap 和局部的 map 占用 O ( ∣ Σ ∣ ) O(|\Sigma|) O(∣Σ∣),即 O ( 1 ) O(1) O(1)
    • 所以总体空间复杂度是 O ( N ) O(N) O(N)

Code

class Solution {public int countPalindromicSubsequence(String ss) {char[] s = ss.toCharArray();int ret = 0, n = s.length;int[] globalMap = new int[26];for (char c : s) {globalMap[c - 'a']++;}for (int i = 0; i < n - 2; i++) {if (globalMap[s[i] - 'a'] > 1) {for (int k = n - 1; k > i + 1; k--) {if (s[i] == s[k]) {int[] map = new int[26];int alike = 0;for (int j = i + 1; j < k; j++) {if (map[s[j] - 'a'] < 1) {ret++;}if (s[j] == s[i]) {alike++;}map[s[j] - 'a']++;}globalMap[s[i] - 'a'] -= 2 + alike;break;}}}}return ret;}
}

1433. 检查一个字符串是否可以打破另一个字符串(复习)

题目

题目截图3
这是第二次写这道题了,写的还不错,基本上算是掌握了,就不再多说了,详细题解见每日算法-250429

代码

class Solution {public boolean checkIfCanBreak(String ss1, String ss2) {char[] s1 = ss1.toCharArray();char[] s2 = ss2.toCharArray();Arrays.sort(s1);Arrays.sort(s2);boolean s1BreakS2 = true;for (int i = 0; i < s1.length; i++) {if (s2[i] > s1[i]) {s1BreakS2 = false;break;}}boolean s2BreakS1 = true;for (int i = 0; i < s1.length; i++) {if (s1[i] > s2[i]) {s2BreakS1 = false;break;}}return s1BreakS2 || s2BreakS1;}
}

682. 棒球比赛

题目

题目截图4
这是第二次写这道题了,写的还不错,基本上算是掌握了,就不再多说了,详细题解见每日算法-250330

代码

class Solution {public int calPoints(String[] operations) {Stack<String> stack = new Stack<>();for (String in : operations) {int a = 0, b = 0;switch (in) {case "+" -> {String num = stack.pop();a = Integer.parseInt(num);b = Integer.parseInt(stack.peek());stack.push(num);stack.push(String.valueOf(a + b));}case "D" -> {a = Integer.parseInt(stack.peek());stack.push(String.valueOf(2 * a));}case "C" -> stack.pop();default -> stack.push(in);}}int sum = 0;while (!stack.isEmpty()) {sum += Integer.parseInt(stack.pop());}return sum;}
}

http://www.hkcw.cn/article/diMkXUSHIj.shtml

相关文章

ASP.NET MVC添加视图示例

ASP.NET MVC高效构建Web应用- 商品搜索 - 京东 视图&#xff08;V&#xff09;是一个动态生成HTML页面的模板&#xff0c;它负责通过用户界面展示内容。本节将修改HelloWorldController类&#xff0c;并使用视图模板文件&#xff0c;以干净地封装生成对客户端的HTML响应的过程…

Pix4d航测软件正射影像生产流程(一)项目创建及快速空三

1.数据准备 此数据为精灵4RTK无人机拍摄的照片,照片数据完整,像控点数据为RTK采集的CGCS2000坐标系数据。 2.打开pix4D航测软件、打开新项目 打开pix4D航测软件,软件必须在断网的情况下使用。

day 24 元组和OS模块

一、元组 元组&#xff08;Tuple&#xff09;是 Python 中一种不可变的序列数据类型。元组一旦创建&#xff0c;其元素不能被修改、删除或添加。这一特性使得元组在需要保护数据不被意外更改的场景中非常有用&#xff0c;比如作为字典的键或在多线程环境中共享数据。 1、元组…

python 制作复杂表格报告

python 制作复杂表格报告 最近用&#xff4f;&#xff44;&#xff4f;&#xff4f;集成检测系统&#xff0c;有一复杂表格报告需要处理&#xff0c;即要用到数据库中详细实验信息&#xff0c;检测项格式也不统一&#xff0c;在word中需要有宣然&#xff0c;有列合并&#xff…

unity星空运动

// Upgrade NOTE: replaced ‘_Object2World’ with ‘unity_ObjectToWorld’ // Upgrade NOTE: replaced ‘mul(UNITY_MATRIX_MVP,)’ with UnityObjectToClipPos()’ Shader “Unlit/Texture_046” { Properties { _F(“F”,range(1,10)) 4 _MainTex(“MainTex”,2D) “”…

【电拖自控】转速检测数字测速(脉冲计数测速)

电力拖动自动控制系统第4版上海大学阮毅 &#xff08;脉冲计数测速可以用光电式编码器或霍尔编码器。&#xff09; 旋转编码器 光电式旋转编码器是检测转速或转角的元件。 旋转编码器可分为绝对式和增量式两种。绝对式常用于检测转角&#xff0c;增量式用于测转速。 增量式…

软考-系统架构设计师-第十六章 层次式架构设计理论与实践

层次式架构设计理论与实践 16.2 表现层框架设计16.3 中间层框架设计16.4 数据访问层设计16.5 数据架构规划与设计16.6 物联网层次架构设计 软件体系结构为软件系统提供了结构、行为和属性的高级抽象&#xff0c;由构成系统的元素描述这些元素的相互作用、指导元素集成的模式以及…

ZigBee 协议:开启物联网低功耗通信新时代

在物联网蓬勃发展的时代&#xff0c;无线通信技术犹如连接万物的桥梁&#xff0c;而 ZigBee 协议以其独特的优势&#xff0c;在众多通信协议中脱颖而出&#xff0c;成为构建低功耗、可靠物联网网络的关键技术之一。 一、ZigBee 协议的起源与发展 ZigBee 这个名字充满了自然的灵…

计算机网络常见体系结构、分层必要性、分层设计思想以及专用术语介绍

计算机网络体系结构 从本此开始&#xff0c;我们就要开始介绍有关计算机网络体系结构的知识了。内容包括&#xff1a; 常见的计算机网络体系结构 计算机网络体系结构分层的必要性 计算机网络体系结构的设计思想 举例说明及专用术语 计算机网络体系结构是计算机网络课程中…

React---day4

3、React脚手架 生成的脚手架的目录结构 什么是PWA PWA全称Progressive Web App&#xff0c;即渐进式WEB应用&#xff1b;一个 PWA 应用首先是一个网页, 可以通过 Web 技术编写出一个网页应用&#xff1b;随后添加上 App Manifest 和 Service Worker 来实现 PWA 的安装和离线…

初识高通平台收货总结(比较杂)

1、CameraHAL3数据流向 CamraHAL3数据流向图&#xff1a; Camera数据从sensor出来&#xff0c;首先会经过IFE,然后分预览/视频和拍照2种情况。 如果是预览或者录像&#xff0c;是先经过IPE处理&#xff0c;最后输出到显示。 如果是拍照&#xff0c;则是先经过BSP处理&#x…

小牛电动NLT Citi 2025 登场:重塑电自标准,媲美电摩性能

在电动车的世界里&#xff0c;小牛电动一直是创新与品质的代名词。2025 年&#xff0c;小牛 NLT Citi 震撼登场&#xff0c;重新定义了电动自行车的标准&#xff0c;带来前所未有的电摩级体验。 经典大牛电自版全面升级&#xff0c;NLT Citi 完美继承了小牛智能超满配的实力基…

下载jdk教程

首先登录Oracle账号&#xff0c;感谢一下老哥的账号分享 Oracle账号分享_oracle共享账号-CSDN博客 如下有三个版本的jdk下载 推荐下载中间那个 你可以根据自己的需求选择合适的下载方式&#xff0c;下面是每个选项的简要说明&#xff1a; 1. x64 Compressed Archiv…

中国头盔护具展在杭州举办合适

2024年&#xff0c;浙江的人均GDP超过2.5万美元&#xff0c;人均收入和人均消费更是全国第一&#xff1b;省外人口实际净流入达45.4万人&#xff0c;居各省份第一。杭州是浙江省会是中国第八座“两万亿之城”之一‌&#xff0c;城区总人口突破千万&#xff0c;实现从特大城市到…

SpringCloud

微服务 一&#xff1a;MP补充&#xff1a; 1.1.注解&#xff1a; 1.2.配置&#xff1a; 1.3.条件构造器&#xff1a; 1.4.自定义sql&#xff1a; 在有些业务中&#xff0c;需要我们手动来编写部分sql语句&#xff0c;但是在开发业务中&#xff0c;sql语句是不能直接暴露在业…

基于大数据的个性化购房推荐系统设计与实现(源码+定制+开发)面向房产电商的智能购房推荐与数据可视化系统 基于Spark与Hive的房源数据挖掘与推荐系统设计

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

GPU层次结构(Nvidia和Apple M芯片,从硬件到pytorch)

这里写目录标题 0、驱动pytorch环境安装验证1.window环境2.Mac Apple M芯片环境 1、Nvidia显卡驱动、CUDA、cuDNN关系汇总1**1. Nvidia显卡驱动&#xff08;Graphics Driver&#xff09;****2. CUDA&#xff08;Compute Unified Device Architecture&#xff09;****3. cuDNN&a…

Ubuntu 22.04 上安装 PostgreSQL(使用官方 APT 源)

Ubuntu 22.04 上安装 PostgreSQL&#xff08;使用官方 APT 源&#xff09; 步骤 1&#xff1a;更新系统 sudo apt update sudo apt upgrade -y步骤 2&#xff1a;添加 PostgreSQL 官方仓库 # 安装仓库管理工具 sudo apt install wget ca-certificates gnupg lsb-release -y#…

游戏盾在非游戏行业的应用实践与价值分析

游戏盾最初是为应对游戏行业的高并发、复杂协议攻击&#xff08;如DDoS、CC攻击&#xff09;而设计的网络安全解决方案&#xff0c;但随着技术演进&#xff0c;其分布式架构、智能调度和协议解析能力逐渐被扩展至其他高流量、高安全需求的非游戏领域。本文将结合实际案例&#…