leetcode 滑动窗口小结 (三)

目录

  • 978. 最长湍流子数组
    • 题目
    • 思路分析以及代码
  • 1052. 爱生气的书店老板
    • 题目
    • 思考分析与初步代码
    • 优化思路以及优化代码
  • 1208. 尽可能使字符串相等
    • 题目
    • 思考分析以及代码

978. 最长湍流子数组

https://leetcode-cn.com/problems/longest-turbulent-subarray/

题目

当 A 的子数组 A[i], A[i+1], …, A[j] 满足下列条件时,我们称其为湍流子数组:

若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1];
或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]。
也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。

返回 A 的最大湍流子数组的长度。

示例1:

输入:[9,4,2,10,7,8,8,1,9]
输出:5
解释:(A[1] > A[2] < A[3] > A[4] < A[5])

示例2:

输入:[4,8,12,16]
输出:2

示例 3:

输入:[100]
输出:1

提示:
1 <= A.length <= 40000
0 <= A[i] <= 10^9

思路分析以及代码

这一题是典型的滑动窗口问题。
我的大致思路如下:
1、获取差分数组
2、从左到右比对差分数组,观察相邻两个元素是否异号(一个大于0 ,一个小于0;或者相反)
3、如果异号,说明符合条件;更新窗口值,右边界继续扩展
4、否则,说明当前[left,right)中都不符合条件,需要直接将左边界更新到原有的右边界。
5、意外情况:下面有几种意外情况我是特殊处理的

1、原数组小于等于1,直接返回数组大小
2、如果差分数组中全部都是0,此时返回1

class Solution {
public:int juge(int a , int b){if((a > 0 && b < 0) || (a < 0 && b >0)) return true;else return false;}int maxTurbulenceSize(vector<int>& arr) {if(arr.size() <= 1) return arr.size();int n = arr.size();vector<int> diff(n - 1);for(int i = 0; i < n - 1; i++){diff[i] = arr[i+1] - arr[i];}int left = 0 ,right = 1;int max_window_size = 1;int zero_diff_times = 0;if(diff[0] == 0) zero_diff_times++;while(right < diff.size()){if(juge(diff[right],diff[right - 1])){max_window_size = max(max_window_size,right - left + 1);}else{if(diff[right] == 0) zero_diff_times++;left = right;}right++;}if(zero_diff_times == diff.size()) return 1;return max_window_size+1;}
};

1052. 爱生气的书店老板

https://leetcode-cn.com/problems/grumpy-bookstore-owner/

题目

今天,书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开。

在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。 当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满意的。

书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 X 分钟不生气,但却只能使用一次。

请你返回这一天营业下来,最多有多少客户能够感到满意的数量。
示例:

输入:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3
输出:16
解释:
书店老板在最后 3 分钟保持冷静。
感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.

提示:

1 <= X <= customers.length == grumpy.length <= 20000
0 <= customers[i] <= 1000
0 <= grumpy[i] <= 1

思考分析与初步代码

初步思路:
1、从第一个时间段开始遍历,遍历每个窗口长度为X的时间段,并且计算这个时间段内老板生气的时间顾客来的人数。
2、依次遍历完整个时间段,找到时间段内老板生气的时间顾客来的人数最多的人数。
3、最后再遍历一遍原数组,记录下老板不生气时候来的总人数
4、两个结果相加,得到最终结果。

class Solution {
public:int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int X) {int max_sum_start = 0;int max_sum = 0;for(int start = 0; start < customers.size() - X + 1; start++){int sum = 0;for(int i = start; i < start + X ; i ++){if(grumpy[i] == 1) sum += customers[i];}if(sum >= max_sum){max_sum = sum;max_sum_start = start;}}//cout << "max_sum= " << max_sum << endl;int result = 0;for(int i = 0; i < customers.size(); i++){if(grumpy[i] == 0) result+=customers[i];}return result+max_sum;}
};

很显然时间复杂度是O(N * X)

优化思路以及优化代码

关于长度固定的滑动窗口,有一点我们要熟悉的是,窗口每次滑动时,变化的只有头尾两个元素,所以我们只针对这两个元素进行处理就行。
不过对于第一个窗口需要特殊对待,需要先进行填充。
接下来的窗口中,如果新进来的时间是生气的,加上顾客量。如果新出去的时间是生气的,那么减去顾客量。每次滑动都需要更新最大值。

class Solution {
public:int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int X) {int sum = 0;//计算不生气时来的顾客总数for(int i = 0; i < customers.size(); i++){if(grumpy[i] == 0) sum+=customers[i];}int left = 0, right = 0;//第一个区域while(right < X){if(grumpy[right] == 1) sum += customers[right];right++;}int max_sum = sum;while(right < customers.size()){//生气的时间段被移除窗口,总顾客减少if(grumpy[left] == 1)   sum -= customers[left];//生气的时间段被移入窗口,总顾客增加if(grumpy[right] == 1) sum += customers[right];max_sum = max(max_sum,sum);left++;right++;}return max_sum;}
};

1208. 尽可能使字符串相等

题目

给你两个长度相同的字符串,s 和 t。

将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。

用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。

如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。

如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。

示例 1:

输入:s = “abcd”, t = “bcdf”, cost = 3
输出:3
解释:s 中的 “abc” 可以变为 “bcd”。开销为 3,所以最大长度为 3。

示例 2:

输入:s = “abcd”, t = “cdef”, cost = 3
输出:1
解释:s 中的任一字符要想变成 t 中对应的字符,其开销都是 2。因此,最大长度为 1。

示例 3:

输入:s = “abcd”, t = “acde”, cost = 0
输出:1
解释:你无法作出任何改动,所以最大长度为 1。

提示:

1 <= s.length, t.length <= 10^5
0 <= maxCost <= 10^6
s 和 t 都只含小写英文字母。

思考分析以及代码

这一题是一个非常典型的滑动窗口题。
1、首先我们构建差分绝对值数组:

vector<int> diff(s.size());
for(int i = 0; i < diff.size(); i++)
{diff[i] = abs(s[i] - t[i]);
}

2、然后,我们建立滑动窗口的左右边界,在差分数组上移动
3、什么时候扩展窗口?
当我们现在存有的cost - 右边新纳入的cost >= 0 的时候,我们可以继续扩展窗口
4、反之,如果小于0,说明不能继续扩展了。但是由于我们求的是最大窗口长度,所以此时也不需要缩小窗口,只需要将整个窗口平移即可。记住平移的时候,要将新移除的cost加到当前cost上,算是弥补损失。
5、更新窗口最大长度的操作必然是在扩展窗口的时候啦
这一题思路应该还是比较清晰的。当然也有个地方有点不好搞,那就是第三点是>0 还是 >=0.如果有时间的话,可以自己手动推导一下,如果没有就两个都试一下,选择答案正确的即可.

class Solution {
public:int equalSubstring(string s, string t, int maxCost) {//构建相差数组vector<int> diff(s.size());for(int i = 0; i < diff.size(); i++){diff[i] = abs(s[i] - t[i]);}int left = 0, right = 0;int max_length = 0;while(right < diff.size()){//扩大窗口int new_In = diff[right];maxCost = maxCost - new_In;if(maxCost >= 0){max_length = max(max_length,right -left + 1);}else{int new_Out = diff[left];maxCost += new_Out;left++;}right++;}return max_length;}
};

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

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

相关文章

JAVA多线程学习3--线程一些方法

一、通过sleep方法睡眠 在指定的毫秒数内让当前正在执行的线程休眠&#xff08;暂停执行&#xff09;。该线程不丢失任何监视器的所属权。 二、线程优先级 线程具有优先级&#xff0c;范围为1-10。 MAX_PRIORITY线程可以具有的最高优先级。int类型&#xff0c;值为10. MIN_PRIO…

mcq 队列_MCQ | 量子密码学

mcq 队列1) Which possible Attacks in Quantum Cryptography can take place? 1)量子密码术中可能发生哪些攻击&#xff1f; Possible Attacks in Quantum Cryptography and Birthday Attack 量子密码术和生日攻击的可能攻击 Birthday attack and Boomerang attack 生日袭击…

《inside the c++ object model》读书笔记 之一:对象

关于对象 ...引子:在C语言中,"数据"和"处理数据的操作(函数)"是分开来声明的,语言本身并没有支持"数据和函数"之间关联性,这种程序成为"程序性的",由一组"分布在各个一功能为向导的函数中"的算法驱动,他们处理的是共同的外部…

十六、保存和加载自己所搭建的网络模型

一、保存自己搭建的模型方法一 例如&#xff1a;基于VGG16网络模型架构的基础上加上了一层线性层&#xff0c;最后的输出为10类 torch.save(objmodule,f"path")&#xff0c;传入需要保存的模型名称以及要保存的路径位置 保存模型结构和模型的参数&#xff0c;保存文…

uC/OS-II OS_TASK.C中有关任务管理的函数

函数大致用途 OS_TASK.C是uC/OS-II有关任务管理的文件&#xff0c;它定义了一些函数&#xff1a;建立任务、删除任务、改变任务的优先级、挂起和恢复任务&#xff0c;以及获取有关任务的信息。 函数用途OSTaskCreate()建立任务OSTaskCreateExt()扩展建立任务OSTaskStkChk()堆…

windows下写的脚本,在linux下执行失败

Windows中的换行符为CRLF, 即正则表达式的rn(ASCII码为13和10), 而Unix(或Linux)换行符为LF, 即正则表达式的n. 在Windows和Linux下协同工作的时候, 往往这个细小的差别就导致问题, 如 1)Windows下写的Shell脚本, 在Linux下运行时往往出现rn是无效参数, 不能执行; 2)vi 等编器下…

Scala中的do ... while循环

做...在Scala循环 (do...while loop in Scala) do...while loop in Scala is used to run a block of code multiple numbers of time. The number of executions is defined by an exit condition. If this condition is TRUE the code will run otherwise it runs the first …

十七、完整神经网络模型训练步骤

以CIFAR-10数据集为例&#xff0c;训练自己搭建的神经网络模型架构 一、准备CIFAR-10数据集 CIFAR10官网使用文档 torchvision.datasets.CIFAR10(root"./CIFAR_10",trainTrue,downloadTrue) 参数描述root字符串&#xff0c;指明要下载到的位置&#xff0c;或已有数…

μC/OS-Ⅱ 操作系统内核知识

目录μC/OS-Ⅱ任务调度1.任务控制块2.任务管理3.任务状态μC/OS-Ⅱ时间管理μC/OS-Ⅱ内存管理内存控制块MCBμC/OS-Ⅱ任务通信1.事件2.事件控制块ECB3.信号量4.邮箱5.消息队列操作系统内核&#xff1a;在多任务系统中&#xff0c;提供任务调度与切换、中断服务 操作系统内核为每…

第二版tapout

先说说上次流回来的芯片的测试情况。 4月23日&#xff0c; 芯片采用裸片直接切片&#xff0c; bond在板子上&#xff0c;外面加了一个小塑料壳来保护&#xff0c;我们就直接拿回来测试了。 测试的主要分为模拟和数字两部分&#xff0c; 数字部分的模块基本都工作正常&#xff0…

cd-rom门锁定什么意思_CD-ROM的完整形式是什么?

cd-rom门锁定什么意思CD-ROM&#xff1a;光盘只读存储器 (CD-ROM: Compact Disc Read-Only Memory) CD-ROM is an abbreviation of "Compact Disc Read-Only Memory". It is a data storage memory in the form of an optical compact disc, which is read by a syst…

远程工作时的协作工具

远程工作时的协作工具 Google Hangout 用于日常会议和面对面交谈,在国内其实可以用qq来带起。Campfire 用于一天来的持续对话。Screenhero 用于分享屏幕&#xff0c;一起写代码,这个比较有用,可以一起写代码。Balsamiq 用于计划要制作的 UI。Asana 用于管理任务Google Docs 用于…

十八、完整神经网络模型验证步骤

网络训练好了&#xff0c;需要提供输入进行验证网络模型训练的效果 一、加载测试数据 创建python测试文件&#xff0c;beyond_test.py 保存在dataset文件夹下a文件夹里的1.jpg小狗图片 二、读取测试图片&#xff0c;重新设置模型所规定的大小(32,32)&#xff0c;并转为tens…

二分法变种小结(leetcode 34、leetcode33、leetcode 81、leetcode 153、leetcode 74)

目录二分法细节1、leetcode 34 在排序数组中查找元素的第一个和最后一个位置2、不完全有序下的二分查找(leetcode33. 搜索旋转排序数组)3、含重复元素的不完全有序下的二分查找(81. 搜索旋转排序数组 II)3、不完全有序下的找最小元素(153. 寻找旋转排序数组中的最小值)4、二维矩…

ID3D11DeviceContext::Dispatch与numthread笔记

假定——[numthreads(TX, TY, TZ)] // 线程组尺寸。既线程组内有多少个线程。Dispatch(GX, GY, GZ); // 线程组的数量。既有多少个线程组。 那么——SV_GroupThreadID{iTX, iTY, iTZ} // 【线程组内的】线程3D编号SV_GroupID{iGX, iGY, iGZ} // 线程组的3D编号SV_DispatchT…

kotlin 查找id_Kotlin程序查找Square区域

kotlin 查找idFormula to find area of Square: area side*side 查找Square面积的公式&#xff1a; area side * side Given the value of side, we have to find the area of Square. 给定side的值&#xff0c;我们必须找到Square的面积。 Example: 例&#xff1a; Input…

小米手环6解决天气未同步问题

最近我发现了我的米6手环天气不同步&#xff0c;打开Zepp Life刷新同步也不行&#xff0c;后来我找了一些网上的解决方法&#xff0c;尝试了一些也还不行&#xff0c;我这人喜欢瞎捣鼓&#xff0c;无意之间给整好了&#xff0c;后来我开始总结自己操作步骤&#xff0c;就在刚才…

c# datetime._C#| DateTime.Month属性与示例

c# datetime.DateTime.Month属性 (DateTime.Month Property) DateTime.Month Property is used to get the month component of this object. Its a GET property of DateTime class. DateTime.Month属性用于获取此对象的月份组成部分。 这是DateTime类的GET属性。 Syntax: 句…

C++ 内存分配层次以及memory primitives的基本用法

分配层次 C memory primitives 分配释放类型是否可重载mallocfree()C函数不可newdeleteC表达式不可::operator new()::operator delete()C函数可allocator::allocate()allocator::deallocate()C标准库可自由设计并以之搭配任何容器 分配与释放的四个用法 1、malloc and delet…

jQuery easyui layout布局自适应浏览器大小

首先解释一下标题的含义&#xff0c;当我们用jQuery easyui layout 进行布局的时候&#xff0c;可能会遇到这样一个问题&#xff0c;那就是当手工调整浏览器大小&#xff0c;或者最大化、还原窗口的时候&#xff0c;layout的某个区域不能填充因为浏览器扩大而产 生的空白区域&a…