每日算法-250601

article/2025/7/31 18:07:48

每日算法 - 250601

记录今天完成的算法题目。

1. 1749. 任意子数组和的绝对值的最大值

题目描述

题目图片

思路

前缀和

解题过程

子数组的和 sum(nums[i..j]) 可以通过前缀和 prefixSum[j] - prefixSum[i-1] 来计算(规定 prefixSum[-1] = 0)。
我们要求的是 abs(prefixSum[j] - prefixSum[i-1]) 的最大值。

这等价于找到所有前缀和(包括 0)中的最大值 maxP 和最小值 minP,那么结果就是 maxP - minP

具体做法:

  1. 在原数组 nums 上计算前缀和,即 nums[k] 更新为 nums[0] + ... + nums[k]

  2. 在计算前缀和的过程中,我们记录到目前为止遇到的最大前缀和 current_max_prefix 和最小前缀和 current_min_prefix

    • current_max_prefix 初始化为 nums[0](第一个前缀和)。
    • current_min_prefix 初始化为 nums[0](第一个前缀和)。
  3. 遍历数组(从第二个元素开始)更新前缀和,并相应更新 current_max_prefixcurrent_min_prefix

  4. 最终的答案考虑以下三种情况的绝对值:

    • 最大前缀和本身:abs(current_max_prefix)。这对应子数组从索引 0 开始到某个位置结束的情况,其和为 current_max_prefix - 0
    • 最小前缀和本身:abs(current_min_prefix)。这对应子数组从索引 0 开始到某个位置结束的情况,其和为 current_min_prefix - 0
    • 最大前缀和与最小前缀和的差:abs(current_max_prefix - current_min_prefix)。这对应子数组从使得前缀和为 current_min_prefix 的位置之后开始,到使得前缀和为 current_max_prefix 的位置结束(或反之)。

    这三种情况的覆盖可以用 max(abs(current_max_prefix), abs(current_min_prefix), abs(current_max_prefix - current_min_prefix)) 来概括。

复杂度

  • 时间复杂度: O ( N ) O(N) O(N),其中 N N N 是数组 nums 的长度。我们遍历数组一次计算前缀和并更新最大最小值。
  • 空间复杂度: O ( 1 ) O(1) O(1),我们是在原数组上进行修改,或者如果不能修改原数组,则需要 O ( N ) O(N) O(N) 空间存前缀和。题目中代码是原地修改。

Code

class Solution {public int maxAbsoluteSum(int[] nums) {int max = nums[0], min = nums[0];for (int i = 1; i < nums.length; i++) {nums[i] += nums[i - 1];max = Math.max(max, nums[i]);min = Math.min(min, nums[i]);}return Math.max(Math.abs(max - min), Math.max(Math.abs(min), Math.abs(max)));}
}

2. 3361. 两个字符串的切换距离

题目描述

题目图片

思路

前缀和

解题过程

题目要求计算将字符串 ss 中的每个字符 s[i] 变换到 tt 中对应字符 t[i] 的最小代价之和。
对于任意一对字符 start_charend_char,变换有两种方式:

  1. 一直向后(字典序增大)变换,例如 ‘a’ -> ‘b’ -> ‘c’ …,如果超过 ‘z’ 则回到 ‘a’。
  2. 一直向前(字典序减小)变换,例如 ‘c’ -> ‘b’ -> ‘a’ …,如果小于 ‘a’ 则回到 ‘z’。

我们可以预处理出两种代价的前缀和数组:

  1. nextCostL[k]:从字符 ‘a’ 一直向后变换到字符 'a'+k,再到 'a'+(k+1)%26 的累积代价。更准确地说,nextCost[j] 是从字符 j 变换到 (j+1)%26 的代价。那么 nextCostL[k] 存储 sum(nextCost[0]...nextCost[k])

  2. previousCostL[k]:类似地,previousCost[j] 是从字符 j 变换到 (j-1+26)%26 的代价。previousCostL[k] 存储 sum(previousCost[0]...previousCost[k])

遍历字符串 sstt,对于每一对字符 s[i]t[i]

  1. 获取它们的数字表示 start = s[i]-'a'end = t[i]-'a'
  2. 如果 start == end,代价为 0。
  3. 否则,利用预处理的前缀和数组计算向后变换的代价 nextSum 和向前变换的代价 previousSum
    • getVal(prefixArr, index) 是一个辅助函数,用于安全地获取前缀和 prefixArr[index],如果 index < 0 则返回 0
  4. Math.min(nextSum, previousSum) 累加到总结果 ret

复杂度

  • 时间复杂度: O ( N + C ) O(N + C) O(N+C)
  • 空间复杂度: O ( 1 ) O(1) O(1)

Code

class Solution {public long shiftDistance(String ss, String tt, int[] nextCost, int[] previousCost) {char[] s = ss.toCharArray(), t = tt.toCharArray();long ret = 0;long[] nextCostL = new long[26], previousCostL = new long[26];nextCostL[0] = nextCost[0];previousCostL[0] = previousCost[0];for (int i = 1; i < 26; i++) {nextCostL[i] = nextCostL[i - 1] + nextCost[i];previousCostL[i] = previousCostL[i - 1] + previousCost[i];}for (int i = 0; i < s.length; i++) {int start = s[i] - 'a', end = t[i] - 'a';if (start == end) {continue;}long nextSum = 0, previousSum = 0;if (start < end) {nextSum = getVal(nextCostL, end - 1) - getVal(nextCostL, start - 1);previousSum = getVal(previousCostL, start) + (getVal(previousCostL, 25) - getVal(previousCostL, end));} else {nextSum = (getVal(nextCostL, 25) - getVal(nextCostL, start - 1)) +getVal(nextCostL, end - 1);previousSum = getVal(previousCostL, start) - getVal(previousCostL, end);}ret += Math.min(nextSum, previousSum);}return ret;}private long getVal(long[] prefixArr, int index) {if (index < 0) {return 0;}return prefixArr[index];}
}

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

相关文章

算法打开13天

41.前 K 个高频元素 &#xff08;力扣347题&#xff09; 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: …

【Centos7】最小化安装版本安装docker(无wget命令避坑)

文章目录 Centos7安卓docker1. 检查CentOS内核版本2. 一键将CentOs的yum源更换为国内阿里yum源3. 使用root权限登录CentOS。确保yum包更新到最新4.安装docker5.Docker阿里云镜像加速器 Centos7安卓docker 1. 检查CentOS内核版本 Docker要求CentOS系统的内核版本高于3.10&…

Vue-1-前端框架Vue基础入门之一

文章目录 1 Vue简介1.1 Vue的特性1.2 Vue的版本 2 Vue的基础应用2.1 Vue3的下载2.2 Vue3的新语法2.3 vue-devtools调试工具 3 Vue的指令3.1 内容渲染指令{{}}3.2 属性绑定指令v-bind3.3 事件绑定指令v-on3.4 双向绑定指令v-model3.5 条件渲染指令v-if3.6 列表渲染指令v-for 4 参…

Lighttpd CGI配置:404错误排查实录

目录 引言 编写测试程序 前端代码 后端代码 配置CGI模块&#xff08;mod_cgi&#xff09; 如何检查404错误 测试结果 ​编辑 结语 引言 在前面的测试中&#xff0c;我们将lighttpd移植到x210开发板中&#xff0c;今天学生报告说她在进行CGI程序测试时总是遭遇404错误…

卢昌海 | 质量的起源

注&#xff1a;本文为卢昌海 | 质量的起源五篇合辑。 公式巨多&#xff0c;未一一校排。 如有内容异常&#xff0c;请看原文。 卢昌海 | 质量的起源 &#xff08;一&#xff09; 一、引言 物理学是一门试图在最基本层次上理解自然的古老科学&#xff0c;其早期曾是哲学的一部…

5、设置时区、链接wifi

一、修改时区&#xff1a; 输入以下命名打开raspbian系统的设置界面 sudo raspi-config 如下图&#xff0c;通过键盘上下键&#xff0c;移动到第 5 步“localisation Options”&#xff0c;回车进入。 注:每个系统版本不一样&#xff0c;选择就不一样&#xff0c;我的是在第…

81、使用DTU控制水下灯光控制

基本思想:记录调试济南有人DTU控制水下灯光控制 一、首先连接dtu设备,进行供电模块的链接和RS-485控制水下探照灯 线头链接方方式示意图,供电线接入之后,要保证设备处于工作状态,如果设备在供电不处于工作状态,那可能火线和零线接反了,请重新接入; 将红色的线接入RS-4…

【js逆向】易车网某车辆对比信息X-sign

目标网址&#xff1a;aHR0cHM6Ly9jYXIueWljaGUuY29tL2JpeWFkaWUyL3BlaXpoaS8 f12刷新网页查看数据接口 断点调试&#xff1a; 我们的目标网址是 param/get_param_details, 用条件断点 e.url.includes(param/get_param/details) 向上跟栈&#xff0c;这里X-Sign已经生成&#x…

基于TMC5160堵转检测技术的夹紧力控制系统设计与实现

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 90万阅读 1.6万收藏 一、技术背景与系统原理 在工业自动化领域&#xff0c;夹紧力控制是精密装配、机床夹具等场景的核心需求。传统方案多采用压力传感器伺服电机的闭环控制方式&#xff0c;但存在系统复杂…

青岛红狮主教练马永康下课 球队保级压力增大

北京时间5月31日晚,2025赛季中甲第11轮多场比赛展开,广西平果在主场迎战青岛红狮。比赛前,两队分别位于中甲积分榜的倒数第一和第二位。上半场马特乌斯为广西平果打破僵局,下半场双方均未能改写比分。最终,广西平果以1-0战胜青岛红狮,取得联赛首胜并保持了两轮不败,而青…

Maven(黑马)

Maven 是一个强大的项目管理和构建自动化工具&#xff0c;主要用于 Java 项目的构建、依赖管理和文档生成。它通过使用 POM&#xff08;Project Object Model&#xff09;文件来管理项目的配置和依赖关系&#xff0c;从而实现项目的自动化构建和管理。以下是 Maven 的一些核心概…

项目练习:element ui 的icon放在button的右侧

文章目录 一、需求描述二、左侧实现三、右侧实现 一、需求描述 我们知道&#xff0c;element ui的button一般都会配置一个icon 这个icon默认是放在左侧的。 如何让它放在右侧了&#xff1f; 二、左侧实现 <el-buttontype"primary"plainicon"el-icon-d-arr…

大连一景区日撒1000斤蚬子 吸引游客赶海乐

近两日,多名网友分享了在辽宁省大连市夏家河子海滨浴场偶遇工作人员开着铲车、三轮车给游客撒蚬子赶海的情景。景区回应称,在沙滩上撒蚬子是为了让赶海的游客都能挖到东西。这两天,景区每天需要撒约1000斤的蚬子。此外,还有巴掌大的鲍鱼和海螺,如果游客捡到可以兑换礼品。…

位运算 #常见位运算总结 #题解

系列文章目录 leetcode - 双指针问题_leetcode双指针题目-CSDN博客 leetcode - 滑动窗口问题集_leetcode 滑动窗口-CSDN博客 高效掌握二分查找&#xff1a;从基础到进阶-CSDN博客 leetcode - 前缀和_前缀和的题目-CSDN博客 动态规划 - 斐波那契数列模型-CSDN博客 目录 系…

openpnp - 给M4x0.7mm的直油嘴加油的工具选择

文章目录 openpnp - 给M4x0.7mm的直油嘴加油的工具选择概述如果换上带卡口的M4x0.7直油嘴END openpnp - 给M4x0.7mm的直油嘴加油的工具选择 概述 X导轨用了一个HG15的滑块 滑块上的注油口的黄油嘴是M4x0.7mm的直油嘴。 外表面是6边形的柱子&#xff0c;没有可以卡住加油嘴工…

SSL/TLS 协议详解:安全通信的基石

一、概述 SSL&#xff08;Secure Sockets Layer&#xff09; 及其继任者 TLS&#xff08;Transport Layer Security&#xff09; 是位于 传输层&#xff08;TCP&#xff09;与应用层之间 的加密协议&#xff0c;用于在网络通信中实现 机密性、身份认证和数据完整性。 核心目标…

象棋里的卧槽马、侧面虎、金钩马的方位与解析

在中国象棋里&#xff0c;根据马的方位&#xff0c;有不同的称谓&#xff0c;比如卧槽马、侧面虎、金钩马&#xff1b;车也是一样&#xff0c;比如有肋车、沉底车、相位车等。     按照《象棋攻防与口诀》的"边炮车砍象&#xff0c;三七马肋车"口诀&#xff0c;这里…

内存管理 : 05 内存换入-请求调页

操作系统内存换入 - 请求调页讲解 这一讲主要内容是内存的换入&#xff0c;下一讲要讲内存的换出&#xff08;swap out&#xff09;&#xff0c;这两讲合在一起就是内存的换入换出。讲完内存的换入换出&#xff0c;操作系统关于内存管理这部分内容&#xff0c;也就是我们课程里…

任务23:创建天气信息大屏Django项目

任务描述 知识点&#xff1a; Django 重 点&#xff1a; Django创建项目Django视图函数Django路由Django静态文件Django渲染模板 内 容&#xff1a; 使用PyCharm创建大屏项目渲染大屏主页 任务指导 1. 使用PyCharm创建大屏项目。 创建weather项目配置虚拟环境创建ch…

回溯算法!!

只要有递归就会有回溯&#xff0c;回溯隐藏在递归函数的下面 回溯算法是回溯搜索算法&#xff0c;是纯暴力的搜索算法 一般用于解决以下问题 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合&#xff0c;组合是不强调元素顺序的&#xff0c;排列是强调元素顺序。切…