位图 、Max Sum、滑动窗口

news2024/9/27 4:14:03

这篇博客主要总结一下,这两天刷的算法题:

判断字符是否唯一

题目意思很简单不再解读,拿到这道题,其实不难看出哈希表可以直接秒了,注意这是一道面试题,在oj上可以哈希表秒了,如果面试官要求不使用数据结构呢,所以今天带大家用位图的方法来做一下这道题。

注意题目只有小写字母,所以只有26个字母,这里可以先用鸽巢原理优化一下,当给定数组大小大于26时可以直接返回false。

使用位图前首先建立字母和下标的映射:

这个映射建立很简单只需让 字符 - 'a' 即可得出。

位图标记:

0表示没有出现过

1表示出现过

遇到出现过的直接返回false

遇到没出现过的修改它对应的位图为1

这里需要用到两个二级结论:

 1.确定数n二进制第x位是0还是1

(n>>x) & 1

2.将数n二进制的第x位改成1 

n = n | (1 << x)

代码: 

class Solution {
public:
    bool isUnique(string astr) {
        //利用鸽巢原理优化
        if(astr.size()>26) return false;
        int bitmap = 0;
        for(auto ch : astr)
        {
            int in = ch - 'a';//字母与下标形成映射
            if(((bitmap>>in) & 1) == 1) return false;//判断是否存在
            //代码走到这,说明不存在,修改位图
            bitmap = bitmap | (1<<in);
        }
        return true;
    }
};

Max Sum

题目为英文,我用AI翻译了。

思路:

这道题的关键思路是如何判断目前区间有没有结束,结束的意思也就是有没有走下去的必要。

我们用一个sum存数组开始位置到结束位置的和,如果sum现在已经是一个负数了,负数加上任何一个数都会比那个数小,此时end已经完全没有继续走下去的必要了,因为我们完全可以从这个数开始重新对sum开始求和,这个sum肯定比之前的sum要大

同理,如果sum是正数,end还可以继续往下走。

每次走的时候注意更新max和开始结束位置即可

AC代码:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int T = 0;
	cin >> T;
	int count = 1;
	while (T--)
	{
		int n = 0;
		cin >> n;
		vector<int> num(n);
		for (int i = 0;i < n;i++) cin >> num[i];
		int max = num[0];
		int sum = num[0];
		int start = 0, end = 0;//当前的开始和结束位置
		int max_start = 0, max_end = 0;//最大子序列的开始和结束位置
		for (int i = 1;i < n;i++)
		{
			if (sum >= 0)//如果前面序列的和为正数
			{
				sum = sum + num[i];//将下一个数加入sum
				end++;//终点往后移
			}
			else//前面序列和为负数,这个区间走完了
			{
				sum = num[i];//从i位置重新开始一个区间
				start = end = i;
			}
			if (sum > max)//更新max
			{
				max = sum;
				max_start = start;
				max_end = end;
			}
		}
		cout << "Case " << count++ << ":" << endl;
		cout << max << " " << max_start + 1 << " " << max_end + 1;
	}
	return 0;
}

滑动窗口 / 单调队列

这道题我的第一思路是用滑动窗口,每次进窗口用变量更新最大值和最小值,但是难点就在出窗口,出窗口时如果出的是最大值和最小值,最大值和最小值该如何更新是个难点。

然后我想到用大堆和小堆来更新最大值和最小值,但是大堆和小堆只能移除堆顶元素,如果出的既不是最大值也不是最小值就出不了窗口。

最终我终于发现了这道题的妙处,当我们出的元素既不是最大值也不是最小值时,其实不必出窗口因为他们既不是最大值也不是最小值,在窗口里对我们的结果毫无影响,只要当最大值最小值距离窗口右边的位置大于k时,这时再用while出窗口,不仅最大值和最小值能出窗口,还会通过循环将之前那些既不是最大值也不是最小值的元素一并带出

AC代码:

#include<iostream>
#include<queue>
#include<vector>
using namespace std;
struct num//定义该结构体目的为同时存储下标
{
	int i,val;
	bool operator > (const num x) const { return (val > x.val) || (val == x.val && i > x.i); }
	bool operator < (const num x) const { return (val < x.val) || (val == x.val && i < x.i); }
};
int main(){
	priority_queue<num> q1;//大堆
	priority_queue<num,vector<num>,greater<num>>q2;//小堆
	int n, k;
	cin >> n >> k;
	vector<int> arr(n);
	for (int i = 0;i < n;i++)cin >> arr[i];
	vector<int> ret1(n);
	vector<int> ret2(n);
	int m = 0;
	for (int left = 0, right = 0;right < n;right++)
	{
		num in;
		in.i = right;
		in.val = arr[right];
		q1.push(in);
		q2.push(in);//进窗口
		while ((right - q1.top().i + 1) > k)q1.pop();//当最大值或者最小值出窗口是才会真正意义上出窗口
		while ((right - q2.top().i + 1) > k)q2.pop();
		if (right >= k - 1)//存结果
		{
			ret1[m] = q1.top().val;
			ret2[m] = q2.top().val;
			m++;
		}
	}
	for (int i = 0;i < m;i++)cout << ret2[i] << " ";
	cout << endl;
	for (int i = 0;i < m;i++)cout << ret1[i] << " ";
	return 0;
}

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

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

相关文章

如何连接到公司的服务器?

1.下载FileZilla FileZilla的下载与安装以及简单使用&#xff08;有图解超简单&#xff09;-CSDN博客 2.打开 3.输入主机 用户名 密码 端口 注&#xff1a;主机支持的协议类型&#xff1a; 4.连接成功 其他方式也有很多&#xff0c;比如通过cmd&#xff0c;html网页等等 3个…

Apache Doris + Apache Hudi 快速搭建指南|Lakehouse 使用手册(一)

作者&#xff1a;SelectDB 技术团队 导读&#xff1a;湖仓一体&#xff08;Data Lakehouse&#xff09;融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势&#xff0c;帮助用户更加便捷地满足各种数据处理分析的需求。在过去多个版本中&#xff0c;Apache Doris…

下载动画人物

1、网址&#xff1a;动画 2、点击Characters 3、搜索人物 4、点击弹出的人物&#xff0c;弹出对话框选择USE THIS CHARACTER 5、下载 6、点击Animations&#xff0c;搜索walk 7、点击UPLOAD CHARACTER&#xff0c;看到男孩步行&#xff0c;选择In Place&#xff0c;点击下载&…

浅谈后置处理器组件提取器相关的Apply to

浅谈后置处理器组件提取器相关的Apply to 在Apache JMeter中&#xff0c;“提取器”&#xff08;通常指的是正则表达式提取器、JSON路径提取器或CSS/JQuery提取器等&#xff09;是用来从服务器响应中提取信息的重要组件。这些信息可以是cookies、session IDs、特定的文本或者任…

作业一:ER图 作业:二QQ项目思路 作业三:实现QQ的登录与注册界面

一、ER图 二、QQ项目思路&#xff1a;客户端功能&#xff0c;服务器端功能的实现 1.登录注册&#xff1a; 将基本信息如手机号码&#xff0c;验证码&#xff0c;还有已有的账号及账号相关信息等存入数据库中&#xff0c;登录方式为账号密码登录&#xff0c;还有忘记密码用邮箱…

023-GeoGebra中级篇-几何对象之圆锥曲线

圆锥曲线是解析几何中的重要部分&#xff0c;它们包括椭圆、双曲线、抛物线和圆。通过使用预先定义的变量&#xff08;如数值、点和向量&#xff09;&#xff0c;我们可以动态地构建这些曲线的方程&#xff0c;并观察它们如何随变量的变化而变化。本文将介绍如何通过定义变量来…

TikTok 入局小游戏,小游戏出海赛道大热,开发者如何抢滩海外市场?

国内小游戏市场的竞争日益激烈&#xff0c;开发成本上涨、买量的投入成本飙升&#xff0c;对小团队和个人开发者的资金要求量高。除此以外&#xff0c;单款游戏从软著、备案、到认证所需要的时间和费用都大幅提升&#xff0c;也对小游戏市场造成重大影响。重压之下&#xff0c;…

旅游景区度假村展示型网站如何建设渠道品牌

景区、度假村、境外旅游几乎每天的人流量都非常高&#xff0c;还包括本地附近游等&#xff0c;对景区及度假村等固定高流量场所&#xff0c;品牌和客户赋能都是需要完善的&#xff0c;尤其是信息展示方面&#xff0c;旅游客户了解前往及查看信息等。 通过雨科平台建设景区度假…

[图解]分析模式-01-概述1

1 00:00:01,380 --> 00:00:01,770 好 2 00:00:02,340 --> 00:00:06,440 非常感谢大家能够来上我们 3 00:00:06,450 --> 00:00:07,960 分析模式高阶的课程 4 00:00:09,310 --> 00:00:13,440 这个内容之前在分析设计高阶 5 00:00:13,450 --> 00:00:17,840 也就…

客户反馈的智能分析:Kompas.ai如何转化用户声音为行动

客户反馈是企业改进产品和服务、提升客户满意度的重要资源。在数字化时代&#xff0c;如何有效收集和分析客户反馈&#xff0c;将其转化为实际行动&#xff0c;成为企业面临的挑战。Kompas.ai&#xff0c;一款智能客户反馈分析工具&#xff0c;正帮助品牌实现这一目标。 客户反…

nginx 正常访问,刷新404

问题描述&#xff1a; 部署完成前端服务&#xff0c;浏览器正常访问没有问题&#xff0c;但是F5刷新的时候&#xff0c;会提示404&#xff0c;丢失了资源。 解决办法&#xff1a; 在nginx配置中增加如下代码&#xff1a; try_files $uri $uri/ /index.html;

【Linux】进程间通信——命名管道和共享内存

目录 命名管道&#xff08;named pipe&#xff09; 命令行中使用 代码中使用 共享内存&#xff08;shared memory&#xff09; shmget ipcs命令 shmctl shmat/shmdt 简单通信 命名管道&#xff08;named pipe&#xff09; 之前我们说了匿名管道&#xff0c;但是匿名管道…

9717 取数对弈

首先&#xff0c;我们需要初始化两个数组&#xff0c;一个用于存储输入的数列a[]&#xff0c;另一个用于动态规划过程中存储中间结果的二维数组dp[][]。dp[i][j]表示从数列的第i个数到第j个数时&#xff0c;当前玩家&#xff08;甲方先手&#xff09;能够获得的最大得分。 接下…

2023 N1CTF-n1canary

文章目录 参考n1canary模板类和模板函数make_unique和unique_ptrstd::unique_ptr示例&#xff1a; std::make_unique示例&#xff1a; 结合使用示例 operator->getrandom逆向源码思路exp 参考 https://nese.team/posts/n1ctf2023/ n1canary 模板类和模板函数 template &…

从汇编层看64位程序运行——栈帧(Stack Frame)入门

在《从汇编层看64位程序运行——程序中的栈(Stack)结构及其产生的历史原因》一文中&#xff0c;我们讲解了X86体系架构下&#xff0c;程序的栈结构的特点。本文将介绍另外一个非常重要的结构——栈帧。 A stack frame, often just called a ‘frame,’ is a section of the sta…

大众汽车入职SHL在线测评、英语口语、招聘笔试如何通过、考点分析|备考建议

大众汽车入职在线测验真题考点分析&#xff0c;通过技巧&#xff1f; 大众汽车集团&#xff08;中国&#xff09;在招聘过程中&#xff0c;认知能力测试是评估候选人是否适合某个职位的重要环节。候选人会收到带有线上测评链接的邮件&#xff0c;测评包括胜任力潜力测试(Compe…

MySQL数字相关数据处理函数

目录 1. 随机数生成 rand ( ) 2. 四舍五入 round&#xff08;&#xff09; 3. 舍去 truncate ( ) 4. 向上/下取整 5. 空处理 ifnull&#xff08; x , y &#xff09; 1. 随机数生成 rand ( ) rand ( ) 生成 0 到 1 的随机数&#xff1b; rand ( x ) 生成 0 到 1 的随机数…

Unity之Text组件换行\n没有实现+动态中英互换

前因&#xff1a;文本中的换行 \n没有换行而是打印出来了&#xff0c;解决方式 因为unity会默认把\n替换成\\n 面板中使用富文本这个选项啊 没有用 m_text.text m_text.text.Replace("\\n", "\n"); ###动态中英文互译 using System.Collections; using…

Redis分布式锁-Redisson可重入锁原理的个人见解。

记录Redisson可重入锁的个人见解。 文章目录 前言一、什么叫做锁的重入&#xff1f;二、Redisson可重入锁原理 前言 ⁣⁣⁣⁣ ⁣⁣⁣⁣ 之前在写项目的时候&#xff0c;注意到Redisson可重入锁的一个问题&#xff0c;随即在网上搜索其对应的资料&#xff0c;下面就记录一下个…

nfs共享存储配置

目录 一.存储和NFS共享 1.存储的类型分为三种 2.三种存储架构的应用场景 二.NFS共享存储服务 1.NFS简介 2.NFS存储 3.NFS原理 4.软件介绍 三.搭建NFS服务器 1.搭建 2.使用权限&#xff1a; 读写权限 属主&#xff0c;属组权限 客户端创建文件指向同一属主和属组 …