LeetCode——Weekly Contest 321

news2024/12/23 15:09:22

这段时间经历了组会、开题、回家等等,这才发现周赛已经打到325场了,而我还没有写完321场的题解记录,真是汗颜啊。

LeetCode周赛第321场记录

这场周赛的题目相对比较简单一些,在此简单做个梳理:

在这里插入图片描述
这道题比较简单,就是找出[1,n]之间的一个"中枢"值。

这道题我使用了等差数列的求和公式来快速计算一个范围内的和,随后通过一次遍历来实现中枢值的查找,代码如下:


class Solution {
	/* complexity:O(1) */
	int getSum(int Start, int End)		// 左闭右闭区间
	{
		int Length = End - Start + 1;
		return (int)((Start + End) * ((double)Length / 2));
	}
public:
    int pivotInteger(int n) 
    {
		int Ans = -1;
		/* Compexity: O(n) */
        for(int i = 1 ; i <= n ; ++i)
			if(getSum(1, i) == getSum(i, n))
			{
				Ans = i;
				break;
			}
				
		return Ans;
    }
};


注意在上述代码计算范围和时,除以2的部分一定要转成double类型,否则0.5会被整除抹去导致结果出错。

2486. 追加字符以获得子序列(贪心)

在这里插入图片描述
这道题也同样非常简单,因为子序列是不连续的,所以只需要贪心地统计字符串s中已经出现了的t的子序列长度即可,再用t的长度减去已经匹配的长度即可,代码如下:

class Solution {
public:
    int appendCharacters(string s, string t) 
    {
        int n = s.size(), m = t.size();
		int i = 0, j = 0;	// i,j分别指向要匹配的下一个字符
		while(i < n and j < m)
		{
			while(i < n and s[i] != t[j])
				++i;		// 如果没有匹配到,那么持续递增i
			if(i == n)		// 如果已经到了S的结尾,那么直接跳出循环
				break;
			else			// 否则说明匹配到了相同字符,i、j均向后移动
			{
				++i;
				++j;
			}
		}
		return m - j;		// 最终看j指针停留在哪里,这就是缺少的字符数量
		
    }
};

2487. 从链表中移除节点(单调递增栈)

在这里插入图片描述
这道题一种比较好的解法就是单调栈,在使用单调栈时可以先将一个很大的Dummy节点推到栈中,这个节点是始终不会被推出栈的,这可以帮助我们快速索引到栈底元素从而返回答案。

随后开始遍历链表,并同时使用单调栈维护一个单调不增的序列,这样就可以在 O ( n ) O(n) O(n)的时间复杂度内完成本题的求解,代码也非常简洁优雅,所以这道题中Dummy节点的使用是非常漂亮的,很好地利用了题目中链表节点取值范围的信息

ListNode* removeNodes(ListNode* head) {
        ListNode* ans = new ListNode(1e6);
        stack<ListNode*> st;
        st.push(ans);
        while(head) {
            while(head->val > st.top()->val) st.pop();
            st.top()->next = head;
            st.push(head);
            head = head->next;
        }
        return ans->next;        
    }

2488. 统计中位数为 K 的子数组(数学转换)——O(n)

在这里插入图片描述
这道题是一道考察转化的问题,这里记录一下灵茶山艾府的笔记。
注意这道题对于中位数的定义,当子数组长度为偶数时,直接取中间两个元素的靠左的元素,而不是平均数,这和数学上的中位数定义是不一样的。

// 问题转化思路,首先明确子数组意味着连续,那么我们不能对原先数组进行排序,因为这样会打乱数组元素顺序

// CaseI:如果是奇数长度的数组,那么存在一个数k是中位数意味着小于k和大于k的数字一样多
// 左侧小于k的数字个数 + 右侧小于k的数字个数 = 左侧大于k的数字个数 + 右侧大于k的数字个数
// 移项得到:左侧小于k的数字个数 - 左侧大于k的数字个数 = 右侧大于k的数字个数 - 右侧小于k的数字个数

// 将上式中正项看作+1:那么右侧大于k的数字可以看作+1,左侧小于k的数字可以看作+1
// 负项看作-1:那么右侧小于k的数字可以看作-1,左侧大于k的数字可以看作-1
// 按照这样的做法从k向两侧统计,左侧累计计数值 = 右侧累计计数值即可

//CaseII:如果使偶数长度的数组,因为我们要找的是靠左的中位数,那么上式改为:
// 左侧小于 - 左侧大于 + 1 = 右侧大于 - 右侧小于
// 具体在实施时,只需要保证左侧累计计数值 + 1 = 右侧累计计数值
// 完整代码如下:
int countSubarrays(vector<int> &nums, int k) 
    {
        /*首先找到k的索引位置,这个位置一定是唯一的*/
        int pos = find(nums.begin(), nums.end(), k) - nums.begin(), n = nums.size();
        unordered_map<int, int> cnt;
        cnt[0] = 1;     // 这是因为[k]自身组成的数组一定满足中位数是k

        /*1.从k开始向右统计,大于k加一,小于k减一,并不断更新计数值*/
        for (int i = pos + 1, c = 0; i < n; ++i) {
            c += nums[i] > k ? 1 : -1;
            ++cnt[c];
        }

        /*2.从k开始向左统计,大于k减一,小于k加一,并不断将符合要求的值累加入答案*/
        int ans = cnt[0] + cnt[1]; 
        for (int i = pos - 1, c = 0; i >= 0; --i) {
            c += nums[i] < k ? 1 : -1;
            ans += cnt[c] + cnt[c + 1];     // cnt[c]对应长度为奇数的情况,cnt[c+1]对应长度为偶数的情况
        }
        return ans;
    }


下面是一个具体的例子:
在这里插入图片描述

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

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

相关文章

0xcdcdcdcd异常值引发C++程序崩溃问题的详细分析

目录 1、0xcccccccc、0xcdcdcdcd和0xfeeefeee等常见异常值的说明 2、由0xcdcdcdcd 异常值引发的内存访问违例问题说明 2.1、用户态内存地址与内核态用户地址 2.2、根据0xcdcdcdcd异常值初步估计出引发问题的原因 3、详细分析与问题解决 4、变量未初始化在Debug和Release下…

idea 创建 maven项目报错

问题报错 org.apache.maven.model.validation.DefaultModelValidator: method ‘void ()’ not found 第一次使用Maven创建工程&#xff0c;导入依赖的时候出现报错 idea版本&#xff1a;2021.2 maven版本&#xff1a;3.8.5 看了许多博客说把maven版本降低即可 参考文章&a…

技术栈入门------ElasticSearch

使用ElasticSearch的准备工作 一、在Linux上安装ElasticSearch 1、docker下载elasticSearch和kibana的镜像 docker pull elasticsearch:7.4.2 存储和检索数据 docker pull kibana:7.4.2 可视化检索数据 2、创建目录 mkdir -p /mydata/elasticsearch/config mkdir -p /myd…

[含文档+源码等]微信小程序校园生活小助手+后台管理系统前后分离VUE[包运行成功]

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 [含文档源码等]微信小程序校园生活小助手后台管理系统前后分离VUE[包运行成功] 演示视频 视频去哪了呢&#xff1f;_哔哩哔哩_bilibili 系统介绍 本系…

简单对比一下VRRP和策略路由之间主备切换的差异

前面我们介绍的VRRP&#xff08;&#xff09;&#xff0c;两台设备之间处于主备关系&#xff0c;也就是说&#xff0c;当主设备故障之后&#xff0c;流量才会切换到备设备上。这种使用方式一定程度上讲&#xff0c;不太符合经济适用的原则&#xff0c;我们前面介绍过链路聚合&a…

Java面试--SpringMVC请求流程

用户发送请求&#xff0c;请求被 SpringMVC 前端控制器&#xff08;DispatherServlet&#xff09;捕获&#xff1b;前端控制器&#xff08;DispatherServlet&#xff09;对请求 URL 解析获取请求 URI&#xff0c;根据 URI&#xff0c;调用 HandlerMapping&#xff1b;前端控制器…

求最长递增子序列

题目&#xff1a; 给定数组arr&#xff0c;返回arr的最长递增子序列 举例&#xff1a; arr [2,1,5,3,6,4,8,9,7] 返回最长递增子序列为 [1,3,4,8,9] 方法一&#xff1a;复杂度为O&#xff08;N^2&#xff09; 1. 生成长度为N的数组 dp&#xff0c;dp[i] 表示以arr[i] 这…

架构师必读 —— 逻辑模型(8)

利用框架整理信息 框架用于明确“整体结构”&#xff0c;也指“通过MECE分析法将整体构成要素进行大分类”。重要的是框架应是MECE分析框架&#xff0c;因为 一旦有遗漏和重复&#xff0c;就会导致混乱。整体构成要素可大致分为 3~7大类。 建议先确认目的后思考框架&#x…

实时单目追踪和稠密建图的算法框架:TANDEM算法

01 概述 最近在研究TANDEM算法&#xff0c;是一个实时单目追踪和稠密建图的算法框架。TANDEM的算法框架可以概括为如下的几个部分&#xff1a; 1、位姿计算----在关键帧实施基于滑窗的像素级集束优化&#xff1b; 2、追踪前端----实施直接稠密图片配准&#xff0c;基于全局模…

如何找回电脑回收站删除的文件, 10种恢复工具方法!

你想取回你的回收站删除的文件吗&#xff1f;无论是图像、视频还是文档&#xff0c;我们的设备都会存储所有内容。您可能不小心删除了数据&#xff0c;或者由于其他原因而消失了。要恢复您的文件&#xff0c;您可以访问技术人员或下载任何最好的文件恢复软件。 如果您选择第二…

怎样把电脑D盘合并到c盘?相邻的分区怎么合并到C盘

因为C盘是重要的系统盘&#xff0c;系统用户设置文件夹&#xff0c;包括各个用户的文档、收藏夹、上网浏览信息、配置文件&#xff0c;不能随意删除。如果C盘空间不足&#xff0c;就会影响到电脑的整体运行速率&#xff0c;会导致电脑卡顿&#xff0c;要想彻底地解决这种情况&a…

HTML期末作业课程设计期末大作业——电影网页制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

PHP序列化和反序列化漏洞学习

目录 PHP基础知识&#xff1a; 类的结构&#xff1a; 序列化 反序列化 魔术方法 字符串逃逸 PHP基础知识&#xff1a; 类的结构&#xff1a; 常见访问权限修饰符&#xff1a; public:公共的&#xff0c;在类的内部、子类中或者类的外部都可以使用&#xff0c;不受限制;p…

【GO】 K8s 管理系统项目[API部分--Daemonset]

K8s 管理系统项目[API部分–Daemonset] 1. 接口实现 service/dataselector.go // daemonCell type daemonSetCell appsv1.DaemonSetfunc(d daemonSetCell) GetCreation() time.Time {return d.CreationTimestamp.Time }func(d daemonSetCell) GetName() string {return d.Na…

高性能的Java IDE——IntelliJ IDEA v2022.3全新发布

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 I…

怎样在电脑上录制ppt课件?如何录制课件讲解视频

怎样在电脑上录制ppt课件&#xff1f;在当前的环境下&#xff0c;大部分学生都是在家进行上网课&#xff0c;本文就给大家分享几款非常简单实用的录制教学视频的工具。 一、PPT录屏 在windows系统中有个常用软件就是ppt&#xff0c;ppt也能够录屏&#xff0c;只是我们大家都忽…

postgresql数据库流复制

primary和standby在同一服务器的不同目录下。 primary: /var/postgre/data standby: /var/postgre/data1 1. 加账号 (也可以使用postgres账号) [postgresv-vlxsz-devdb01 data]$ psql psql (14.1) Type "help" for help. postgres# create role replica with r…

自动化制药设备中PLC如何进行远程监控?有何应用场景

随着科学技术水平的不断提高&#xff0c;制药设备也逐步走向自动化。自动化制药设备实现到精确的位置定位&#xff0c;实时的过程监控&#xff0c;快速的网络通讯&#xff0c;在到现场的每个动作的执行&#xff0c;具备高效率的生产特点。PLC作为现在工业设备控制系统的核心&am…

php-fpm 的状态查看和php-fpm 调优随笔

php-fpm status 配置 1. 找到php-fpm的配置文件&#xff0c;将 pm.status_path /status 注释去掉 重启php-fpm 2. 在nginx 中配置一个server块或者配置一个location 3. 最后通过curl 或者 http 请求可以看到php-fpm 的状态 可以带着参数访问&#xff0c;json、xml、html fu…

Android -- 每日一问:在项目中使用AsyncTask会有什么问题吗?

经典回答 那我们考查 AsyncTask 会问些什么呢&#xff1f;得先问问会不会用吧&#xff0c;看看知不知道有 onProgressUpdate 方法。 其次问一下是怎么理解 AsyncTask 的机制&#xff0c;有没有看过它的源代码&#xff1f; 这个问题主要看对方是否对 Android 的东西有好奇心&am…