力扣每日一题3175. 找到连续赢 K 场比赛的第一位玩家

ops/2024/10/24 5:19:15/

看到数据范围n是1e5, k是1e9就可以知道,这题目暴力模拟肯定会超时。

但我们看,在k比n大情况下,一轮循环下来肯定是没有赢家的,需要多轮。当然,我们肯定不可能去一轮一轮模拟,那我们怎么判断谁是赢家呢?其实在这种情况下,有固定的一个人一定是赢家,这个人应该会是谁呢?答案当然是技能值最高的啊。稍微想一想应该很容易想到原因。因为不可能有人击败他,那么只要他开始比赛,后面就一定是他连续赢下去,直到比赛结束。

我们假定技能值最高的人的编号是x。根据前面的分析,我们可以知道,如果其他玩家想要能连续赢k场,那这个玩家的所有比赛一定是在遇到这位x之前就赢了k场比赛了。

这样,我们要模拟的比赛就从k场变成了遇到x之前的所有比赛了。那么,这些比赛我们真的需要把赢得放到第一个,输了的放到最后一个这样去模拟吗?如果你要把最前面的数字移到最后面,还保持其他数据的顺序不变,那只能一个个的把元素往前挪,时间复杂度O(n),在最坏情况下,你需要将n个数都这样移动,时间复杂度O(n^2)。又是超时。

不能模拟,那怎么办呢?实际上我们可以直接一次循环查找它能不能连续赢k场,因为如果它输了一次比赛,那它就被移到了队伍末尾,已经在x之后了,在它下一次出场之前,x已经先出场了。只有x出场,那最后胜出的就只会是x。

因此,我们可以从前到后去遍历玩家 i,判断它能否连续赢下 k 次(其实就是判断它后面的k个数都比它小)。如果能,就直接返回答案 i,不能就继续遍历,直到遇到x就可以结束遍历了。

不过有一个小细节需要注意一下。如果当前的 i 不为 0,那么第 i 个玩家最少已经赢了一次,因为与 i 进行比赛的上一个玩家,已经输掉比赛排到了末尾。

思路已经确定了,剩下的代码就很好写了。就遍历数组记录一下当前的玩家 i 和它赢的次数就可以了。

class Solution {
public:int findWinningPlayer(vector<int>& skills, int k) {int n=skills.size();int maxs=skills[0], maxi=0;for (int i=1; i<n; i++){if (skills[i] > maxs){maxs = skills[i];maxi = i;}}if (k > n){return maxi;}int now=0, cnt=0, win=0;for (int i=1; i<maxi; i++){if (skills[now] > skills[i]){cnt++;if (cnt >= k){win = 1;break;}}else // skills[now] < skills[i]{now = i;cnt=1;if (cnt >= k){win = 1;break;}}}if (win == 1){return now;}else return maxi;}
};

只有两个for循环进行遍历,时间复杂度O(n),空间复杂度O(1)。

其实这个代码还可以再优化一下。直接一次循环找连续赢k场的玩家的同时记录下最大值就可以了。而且这个最大值就是循环结束的时候排在第一个的那个人,都不需要额外用变量去记录了。


http://www.ppmy.cn/ops/128014.html

相关文章

gin入门教程(8):渲染与静态文件

目录结构 /hello-gin │ ├── cmd/ │ └── main.go ├── pkg/ │ └── shared_lib.go ├── internal/ │ └── internal_lib.go ├── api/ │ └── routes.go ├── config/ │ └── config.go ├── migrations/ │ └── migration.sql └…

Vue封装组件并发布到npm仓库

前言 使用Vue框架进行开发&#xff0c;组件封装是一个很常规的操作。一个封装好的组件可以在项目的任意地方使用&#xff0c;甚至我们可以直接从npm仓库下载别人封装好的组件来进行使用&#xff0c;比如iview、element-ui这一类的组件库。但是每个公司的业务场景可能不同&…

Python 实现的风控系统(使用了kafka、Faust、模拟drools、redis、分布式数据库)

以下是一个使用 Python 实现的风控系统示例&#xff0c;涵盖以下技术组件&#xff1a; Kafka 消息中间件&#xff1a;用于实时接收支付业务系统传递的交易数据。Faust&#xff08;Kafka Streams 的 Python 等价&#xff09;&#xff1a;用于流式处理 Kafka 中的消息。规则引擎…

axios直接上传binary

axios直接上传二进制文件 、 axios直接上传apk、axios直接上传binary postman中的参数选项中有个binary&#xff0c;平常我们很少使用&#xff0c;可能有的同学遇到这种情况不太会了&#xff0c;认为后端应该有个字段名来接收&#xff0c;或者使用 Formdata&#xff0c;但其实…

报表工具怎么选?山海鲸VS帆软,哪个更适合你?

概述 在国产报表软件市场中&#xff0c;山海鲸报表和帆软这两款工具都占有一席之地&#xff0c;许多企业在选择报表工具时常常在它们之间徘徊。然而&#xff0c;随着企业对数据分析需求的不断增长和复杂化&#xff0c;如何选取一款高效、易用且性价比高的报表工具&#xff0c;…

中小型医院网站:Spring Boot开发策略

2 相关技术简介 2.1 Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;…

15分钟学Go 第1天:Go语言简介与特点

Go语言简介与特点 1. Go语言概述 Go语言&#xff08;又称Golang&#xff09;是由谷歌于2007年开发并在2009年正式发布的一种开源编程语言。它旨在简单、高效地进行软件开发&#xff0c;尤其适合于网络编程和分布式系统。 1.1 发展背景 多核处理器&#xff1a;随着计算机硬件…

SOLID 原则:编写可扩展且可维护的代码

有人告诉过你&#xff0c;你写的是“糟糕的代码”吗&#xff1f; 如果你有&#xff0c;那真的没什么可羞愧的。我们在学习的过程中都会写出有缺陷的代码。好消息是&#xff0c;改进起来相当简单——但前提是你愿意。 改进代码的最佳方法之一是学习一些编程设计原则。你可以将…