5. 1749.任意子数组和的绝对值的最大值(中等,学习)

1749. 任意子数组和的绝对值的最大值 - 力扣(LeetCode)

思想

1.给你一个整数数组 nums 。一个子数组 [numsl, numsl+1, ..., numsr-1, numsr]和的绝对值abs(numsl + numsl+1 + ... + numsr-1 + numsr)
请你找出 nums和的绝对值 最大的任意子数组(可能为空),并返回该 最大值
abs(x) 定义如下:

  • 如果 x 是负整数,那么 abs(x) = -x
  • 如果 x 是非负整数,那么 abs(x) = x
    2.此题**abs(numsl + numsl+1 + ... + numsr-1 + numsr)转化为abs(s[r+1]-s[l])的最大值,即一个s数组,选取两个元素,让他们两个差的绝对值最大,所以为s数组的最大值mx减去s数组的最小值mn**,因为子数组可能为空(即s[0]=0),所以mx,mn初始化为0
    3.此题转化的含义为:
  • 变成一条曲线,表示和的累计值,然后mx,mn就是最大值点和最小值点,他们直接的区间就是这个子数组和的累计值,表示他们的变化量最大(绝对值)
  • mx的坐标>mn的坐标,表示正的和的最大值
  • mx的坐标<mn的坐标,表示负的和的最小值,绝对值变成最大值
代码

c++:

class Solution {
public:int maxAbsoluteSum(vector<int>& nums) {int n = nums.size();int s = 0, mx = 0,mn = 0; // s[0]=0,所以mx,mn初始值为0,因为子数组可能为空for (int i = 0; i < n; ++i) {s += nums[i];mx = max(mx, s);mn = min(mn, s);}return mx - mn;}
};
6. 2389.和有限的最长子序列(简单,想到二分查找优化)

2389. 和有限的最长子序列 - 力扣(LeetCode)

思想

1.给你一个长度为 n 的整数数组 nums ,和一个长度为 m 的整数数组 queries
返回一个长度为 m 的数组 answer ,其中 answer[i]nums 中 元素之和小于等于 queries[i]子序列最大 长度 。
子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。
2.因为是子序列,所以是任意选取的,不要求连续,只要找到一个子序列能够满足条件就可以更新长度,所以贪心思想元素越小越好,所以先对nums数组排序,然后求得前缀和s数组,接下来就是寻找最后一个满足s[tmp]<=queries[i]的下标tmp,因为s数组是有序的,所以可以将顺序查找优化为二分查找,因为s[tmp]对应nums[0...tmp-1]数组和,长度就为tmp

代码

c++:

class Solution {
public:vector<int> answerQueries(vector<int>& nums, vector<int>& queries) {int n = nums.size(), m = queries.size();sort(nums.begin(), nums.end());vector<int> s(n + 1);s[0] = 0;for (int i = 0; i < n; ++i) {s[i + 1] = s[i] + nums[i];}vector<int> res;for (int i = 0; i < m; ++i) {int j = 0;while (j + 1 < n + 1 && s[j + 1] <= queries[i])++j;res.emplace_back(j);}return res;}
};

二分优化:

class Solution {
public:vector<int> answerQueries(vector<int>& nums, vector<int>& queries) {int n = nums.size(), m = queries.size();sort(nums.begin(), nums.end());vector<int> s(n + 1);s[0] = 0;for (int i = 0; i < n; ++i) {s[i + 1] = s[i] + nums[i];}vector<int> res;for (int i = 0; i < m; ++i) {int left = 0, right = n, tmp = 0;while (left <= right) {int mid = left + ((right - left) >> 1);// 找到满足条件的,更新答案,找更大的if (s[mid] <= queries[i]) {tmp = mid;left = mid + 1;} elseright = mid - 1;}// s[tmp]:nums[0...tmp-1]长度为tmpres.emplace_back(tmp);}return res;}
};
7. 3361.两个字符串的切换距离(中等,学习环形延长一倍变成非环形)

3361. 两个字符串的切换距离 - 力扣(LeetCode)

思想

1.给你两个长度相同的字符串 st ,以及两个整数数组 nextCostpreviousCost
一次操作中,你可以选择 s 中的一个下标 i ,执行以下操作 之一

  • s[i] 切换为字母表中的下一个字母,如果 s[i] == 'z' ,切换后得到 'a' 。操作的代价为 nextCost[j] ,其中 j 表示 s[i] 在字母表中的下标。
  • s[i] 切换为字母表中的上一个字母,如果 s[i] == 'a' ,切换后得到 'z' 。操作的代价为 previousCost[j] ,其中 js[i] 在字母表中的下标。
    切换距离 指的是将字符串 s 变为字符串 t最少 操作代价总和。
    请你返回从 st切换距离
    2.就是提前计算出nextCost和previousCost的前缀和数组,然后分类讨论考虑时要考虑清楚区间范围是什么,然后决定前缀和数组的下标
    3.字母表是环形的,可以把前缀和数组延长一倍,可以大大简化讨论
代码

c++:

class Solution {
public:long long shiftDistance(string s, string t, vector<int>& nextCost,vector<int>& previousCost) {long long res = 0;int n = s.size();vector<long long> sNext(27);vector<long long> sPre(27);sNext[0] = 0;sPre[0] = 0;for (int i = 0; i < 26; ++i) {sNext[i + 1] = sNext[i] + nextCost[i];sPre[i + 1] = sPre[i] + previousCost[i];}for (int i = 0; i < n; ++i) {int ids = s[i] - 'a', idt = t[i] - 'a';long long mn = 0;if (ids < idt) {// 向后:nextCost[ids...idt-1],向前排除:preCost[ids+1...idt]mn = min(sNext[idt] - sNext[ids],sPre[26] - (sPre[idt + 1] - sPre[ids + 1]));}// 向前:PreCost[idt+1..ids],向后排除:nextCost[idt...ids-1]elsemn = min(sPre[ids + 1] - sPre[idt + 1],sNext[26] - (sNext[ids] - sNext[idt]));res += mn;}return res;}
};

延长一倍优化循环数组:

class Solution {
public:long long shiftDistance(string s, string t, vector<int>& nextCost,vector<int>& previousCost) {long long res = 0;int n = s.size();const int SIGMA = 26;vector<long long> sNext(2 * SIGMA + 1, 0);vector<long long> sPre(2 * SIGMA + 1, 0);sNext[0] = 0;sPre[0] = 0;for (int i = 0; i < 2 * SIGMA; ++i) {sNext[i + 1] = sNext[i] + nextCost[i % SIGMA];sPre[i + 1] = sPre[i] + previousCost[i % SIGMA];}for (int i = 0; i < n; ++i) {int x = s[i] - 'a', y = t[i] - 'a';// 向后是ids->idt-1,所以s数组是ids->idt,向前是idt+1->ids,所以s数组是idt+1->ids+1// sNext只有y<x时,y才加;sPre只有x<y时,x才加res += min(sNext[y < x ? y + SIGMA : y] - sNext[x],sPre[(x < y ? x + SIGMA : x) + 1] - sPre[y + 1]);}return res;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创客匠人视角下创始人 IP 打造的底层逻辑与实践路径

在知识付费行业蓬勃发展的当下&#xff0c;创始人 IP 已成为连接用户与商业价值的核心纽带。创客匠人创始人老蒋在与行业头部 IP 洪鑫的对话中揭示了一个关键命题&#xff1a;IP 打造的成败&#xff0c;始于发心与理念的根基。从洪鑫教育中心营收超 6000 万的案例来看&#xff…

2022/7 N2 jlpt词汇

気力&#xff08;きりょく&#xff09; 清く&#xff08;きよく&#xff09; 記録&#xff08;きろく&#xff09; 記憶&#xff08;きおく&#xff09; 賢い&#xff08;かしこい&#xff09; 偉い&#xff08;えらい&#xff09; 凄い&#xff08;すごい&#xff09; 鋭い&am…

系统性能优化-8 TCP缓冲区与拥塞控制

每个 TCP 连接都有发送缓冲区和接收缓冲区&#xff0c;发送缓冲区存已发送未确认数据和待发送数据&#xff0c;接收缓冲区存接收但是没有被上层服务读取的数据。 # cat /proc/net/sockstat sockets: used 1885 TCP: inuse 537 orphan 0 tw 3 alloc 959 mem 10其中 mem 代表当前…

【前端】vue工程环境配置

环境准备(Windows版本) nodejs安装 (base) PS C:\Users\Administrator> nvm install 18.8.0 (base) PS C:\Users\Administrator> nvm use 18.8.0 Now using node v18.8.0 (64-bit) (base) PS C:\Users\Administrator> npm -v 8.18.0 (base) PS C:\Users\Administrat…

什么是data version control?为什么需要它?它能解决什么问题?

Data Version Control (DVC) 是一个开源工具&#xff0c;专为数据科学和机器学习项目设计。它的核心目标是像 Git 管理代码一样来管理机器学习项目中的数据和模型文件。 简单来说&#xff0c;DVC 是什么&#xff1f; Git for Data & Models&#xff1a; 它扩展了 Git 的功…

简约计生用品商城简介

计生用品商城简介&#xff1a;uniapp结合thinkphp实现的全开源代码&#xff0c; 内置基本功能&#xff1a;1.后台商品excel一键导入 2.分销利润&#xff0c;按照利润加个分红

go中自动补全插件安装-gopls

vscode中安装gopls失败&#xff0c;导致go中代码无提示&#xff0c;无法自动补全引用 环境变量中设置go的代理&#xff1a;setx GOPROXY “https://goproxy.cn,direct”go install golang.org/x/tools/goplslatest

力扣寻找数组中心索引-性能优化思考

如下代码 var pivotIndex function(nums) {// 空数组返回-1if (nums.length 0) return -1// 计算数组总和const totalSum nums.reduce((sum, num) > sum num, 0);let leftSum 0;// 遍历数组查找中心索引for (let i 0; i < nums.length; i) {// 右侧和 总和 - 左侧…

SVN 分支管理(本文以Unity项目为例)

文章目录 1.准备工作2.新建SVN仓库2.拉取远端空 trunk 到Unity项目目录下3.设置忽略&#xff0c;提交unity项目至仓库3.创建分支4.切换分支5.合并分支回主干&#xff08;例如将 trunk_01 合并回 trunk&#xff09;5.删除分支&#xff08;可选&#xff09; 1.准备工作 下载Tort…

数据结构学习day6---流+读写函数+缓冲+定义函数

目录 1.标准io&#xff1b; stdio.h 1.1标准io的概念 1.2Linux操作系统当中IO都是对文件的操作 1.3标准IO&#xff1a;ANSI C 设计的一组用文件IO 封装的操作库函数 2.文件 2.1作用 2.2linux中文件的类型 3.man 5.流: FILE* 5.1流的定义 5.2流的分类 6.c语言文…

互联网医院,正在发生的医疗新变革

随着信息技术的飞速发展&#xff0c;互联网医院作为医疗服务的新形态&#xff0c;正在全球范围内迅速崛起。在中国&#xff0c;这一变革尤为显著&#xff0c;互联网医院不仅改善了医疗服务的可及性和便捷性&#xff0c;还极大地提升了医疗服务的质量和效率。 一、互联网医院的发…

rabbitmq动态创建交换机、队列、动态绑定,销毁

// 缓存已创建的绑定&#xff0c;避免重复声明private final Map<String, Date> createdBindings new ConcurrentHashMap<>(); public void createAndBindQueueToExchange(String type,String clinetId, String routingKey) {String queueName routingKey;lo…

云效代码仓库导入自建gitlab中

登录自建GitLab 在浏览器中输入GitLab访问地址http://192.168.1.111:81/users/sign_in&#xff0c;输入账号和密码登录GitLab服务&#xff0c;如下图&#xff1a; 新建一个空的代码库 按照以下截图顺序&#xff0c;创建一个新的空项目&#xff0c;如下&#xff1a; 克隆镜像 …

业界优秀的零信任安全管理系统产品介绍

腾讯 iOA 零信任安全管理系统 简介&#xff1a;腾讯 iOA 零信任安全管理系统是腾讯终端安全团队针对企业安全上云和数字化转型&#xff0c;提供的企业网络边界处的应用访问管控系统&#xff0c;为企业应用提供统一、安全、高效的访问入口&#xff0c;同时提供终端安全加固、软…

从设计到开发一个小程序页面

巧妇难为无米之炊&#xff0c;想写功能但是没有好看的设计&#xff0c;边写边设计效率又不够高。mastergoAi生成的页面又不够好看&#xff0c;而且每月给的免费积分用得又超快&#xff0c;so决定自给自足。能有多难&#xff0c;先做&#xff0c;做了再改。 于是决定踏足设计&a…

Linux系统 / Ubuntu虚拟机 安装DHCP服务

一、安装DHCP服务 xxx:~$ sudo apt install isc-dhcp-server 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 将会同时安装下列软件&#xff1a; libirs-export161 libisccfg-export163 建议安装&#xff1a; isc-dhcp-s…

Spring中 BeanFactory和FactoryBean分别是什么?

Spring 中 BeanFactory 是什么? BeanFactory其实就是IoC的底层容器&#xff0c;它本身只是一个接口&#xff0c;顾名思义Bean工厂&#xff0c;定义了Spring的基本功能框架&#xff0c;主要功能就是 负责从配置源中读取 Bean 的定义&#xff0c;并创建、管理这些 Bean 的生命周…

langchain从入门到精通(三十二)——RAG优化策略(八)自查询检索器实现动态数据过滤

1. 查询构建与自查询检索器 在 RAG 应用开发中&#xff0c;检索外部数据时&#xff0c;前面的优化案例中&#xff0c;无论是生成的 子查询、问题分解、生成假设性文档&#xff0c;最后在执行检索的时候使用的都是固定的筛选条件&#xff08;没有附加过滤的相似性搜索&#xff…

面向安全产品测试的静态混淆型 Shellcode Loader 设计与对抗分析

github 地址&#xff1a;https://github.com/LilDean17/ShellcodeLoader2025 一、项目背景 近年来&#xff0c;随着 C2 框架广泛应用于安全对抗模拟&#xff0c;各大安全厂商也不断提升其检测能力&#xff0c;那么安全厂商自研的安全软件&#xff0c;是否能有效防御此类威胁&…

深度强化学习DRL——策略学习

一、策略网络 策略函数 π \pi π的输入是状态 s s s和动作 a a a&#xff0c;输出是一个介于0和1之间的概率值&#xff0c;用神经网络 π ( a ∣ s ; θ ) \pi(a \mid s; \boldsymbol{\theta}) π(a∣s;θ)近似策略函数 π ( a ∣ s ) \pi(a\mid s) π(a∣s)&#xff0c; θ …