• 题目描述:
  • 给你两个整数数组 persons 和 times 。在选举中,第 i 张票是在时刻为 times[i] 时投给候选人 persons[i] 的。
    对于发生在时刻 t 的每个查询,需要找出在 t 时刻在选举中领先的候选人的编号。
    在 t 时刻投出的选票也将被计入我们的查询之中。在平局的情况下,最近获得投票的候选人将会获胜。
    实现 TopVotedCandidate 类:
    TopVotedCandidate(int[] persons, int[] times) 使用 persons 和 times 数组初始化对象。
    int q(int t) 根据前面描述的规则,返回在时刻 t 在选举中领先的候选人的编号。
  • 示例:
  • 输入:
    [“TopVotedCandidate”, “q”, “q”, “q”, “q”, “q”, “q”]
    [[[0, 1, 1, 0, 0, 1, 0], [0, 5, 10, 15, 20, 25, 30]], [3], [12], [25], [15], [24], [8]]
    输出:
    [null, 0, 1, 1, 0, 0, 1]
    解释:
    TopVotedCandidate topVotedCandidate = new TopVotedCandidate([0, 1, 1, 0, 0, 1, 0], [0, 5, 10, 15, 20, 25, 30]);
    topVotedCandidate.q(3); // 返回 0 ,在时刻 3 ,票数分布为 [0] ,编号为 0 的候选人领先。
    topVotedCandidate.q(12); // 返回 1 ,在时刻 12 ,票数分布为 [0,1,1] ,编号为 1 的候选人领先。
    topVotedCandidate.q(25); // 返回 1 ,在时刻 25 ,票数分布为 [0,1,1,0,0,1] ,编号为 1 的候选人领先。(在平局的情况下,1 是最近获得投票的候选人)。
    topVotedCandidate.q(15); // 返回 0
    topVotedCandidate.q(24); // 返回 0
    topVotedCandidate.q(8); // 返回 1

  • 解析,乍一看,这个问题有点小复杂,因为他是根据时间来决定应该查询的投票情况,当出现平票的时候,最近获得投票的人获胜。先不考虑这些细枝末节,很容易想到,输入t,我们要用二分查找在times找到他应该插入的位置索引,这就能得到我们时间的投票情况,但是如果我们每次输入t,都进行重新查找,即找到t对应的插入位置索引,得到投票情况,统计不同候选人的投票数,判断是否存在平票,如果不存在,返回最大的,如果存在,从后往前遍历当前时间范围内的投票情况,返回第一个处于平票状态的候选人编号,这样理论上是肯定行得通的,但是时间复杂度很高,在leetcode时间上不能通过。所以,我们进一步考虑这个问题,既然查询条件是时间,而且times是递增,因此,我们就在初始化的时候维护一个数组tops,每一个时刻对应一个成功的候选人,我们通过二分查找找到查询时刻所对应的插入位置索引,直接在tops里面进行查找就可以了。
  • 代码如下:
import bisect
class TopVotedCandidate:def __init__(self, persons: List[int], times: List[int]):"""对self.tops和self.times进行初始化>>>TopVotedCandidate topVotedCandidate = new TopVotedCandidate([0, 1, 1, 0, 0, 1, 0], [0, 5, 10, 15, 20, 25, 30]);>>>topVotedCandidat.tops>>>[0, 1, 1, 0, 0, 1, 0]"""top, tops=-1,  []votes = {}votes[-1] = -1for vote in persons:votes[vote] = votes.setdefault(vote, 0) + 1if votes[vote] >= votes[top]: top = votetops.append(top)self.tops = topsself.times = times def q(self, t: int) -> int:"""返回当前时刻获胜的候选人>>>topVotedCandidate(12)>>>1"""return self.tops[bisect.bisect_right(self.times, t)-1]
  • bisect.bisect_right(times, t)是包bisect的一个方法,基于二分查找的方法返回t在times应该插入的位置索引,当times中有和t一样的元素时,将t插入到该相同元素的右边。

leetcode刷题日记-在线选举相关推荐

  1. 一个算法笨蛋的12月leetCode刷题日记

    类似文章 一个算法笨蛋的2021年11月leetCode刷题日记 一个算法笨蛋的2021年12月leetCode刷题日记 一个算法笨蛋的2022年1月leetCode刷题日记 一个算法笨蛋的2022年 ...

  2. Leetcode刷题日记(十二)

    又是老台词:欢迎大家来到一晚一度的leetcode刷题日记时间.今天我们来讲讲队列的问题,队列这方面的基础知识需要的同学到博主前面的文章找吧.队列这方面的问题平时博主也是接触得比较少的.下面是一道利用 ...

  3. Leetcode刷题日记:21-25题篇

    Leetcode刷题日记:21-25题篇 简介 题目: 21. 合并两个有序链表 22. 括号生成 23. 合并K个升序链表 24. 两两交换链表中的节点 25. K 个一组翻转链表 注 简介 这个系 ...

  4. 【LeetCode刷题日记】常用算法基础和理解及运用

    在我们LeetCode刷题过程中,如果我们只是了解数据结构(数组,链表,数)的使用方法,那我们在面对复杂的题目时,是很难很好的解决问题的,因此我们要了解一些常用算法来帮助我们更好的解题. 递归和迭代 ...

  5. leetcode刷题日记(一)—— 数组

    因为暑期实习找得很不顺利,感觉自身最大的问题体现在刷题量偏少,操作系统,数据库基础不好,所以现在决定写博客来记录整个过程,希望能找到大厂offer,如果不能找到的话也算是为秋招做准备. 剑指offer ...

  6. [东哥的leetcode刷题日记] leetcode 278 :First Bad Version

    leetcode 278 :First Bad Version 题目链接: https://leetcode-cn.com/problems/search-insert-position/ 难度: 简 ...

  7. LeetCode刷题日记盛最多水的容器

    节后第一天,鉴于五一五天都没做过题,有点遗忘了,今天来看一道简单点的题,练下手. 先看下题: 给你 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条 ...

  8. 石器时代 —— Leetcode刷题日记 (一 百大热题)

    Date: 2019.10.22 - (C++ Version) 文章目录 All Labels: `热题100` L1 两数之和 L2 两数相加 暴力相加 递归 迭代 L3 无重复字符的最长子串 L ...

  9. [东哥的leetcode刷题日记] leetcode 283 : Move Zeroes

    leetcode 283 : Move Zeroes 题目链接: https://leetcode-cn.com/problems/move-zeroes/ 难度: 简单 归类 : 数组操作 题目: ...

  10. LeetCode刷题日记精选例题(解析+代码+链接)

    文章目录 一.用栈模拟队列 二.用队列模拟栈 三.有效的括号 解法一 解法二 四.删除字符串中所有相邻重复项 五.逆波兰表达式求值 六.滑动窗口最大值 七.前k个高频元素 一.用栈模拟队列 因为队列先 ...

最新文章

  1. 分布式存储的三个基本问题
  2. c语言调用shell脚本或命令
  3. 火狐浏览器中添加selenium IDE步骤
  4. 系统需要联网吗_气体灭火系统储气瓶上的保险销需要拔掉吗?
  5. 随机生成1024个数,存入一段内存,用指针实现获取1024个数的最大数地址,最小数地址
  6. 设置MYSQL允许用IP访问
  7. 1 计算机网络体系结构与OSI参考模型
  8. Java非对称加密KeyPairGenerator类
  9. 钩子编程(HOOK) 安装进程内键盘钩子 (1)
  10. MPUSH消息推送服务器搭建,MPUSH消息推送服務器搭建
  11. char ch= 中 什么意思java_c语言中char ch什么意思
  12. gcc 版本管理工具 scl
  13. 使用腾讯云轻量应用服务器搭建视频直播服务器
  14. 【Python】一个简陋的基于混淆矩阵计算遥感分类精度(总体精度、Kappa系数、用户精度、生产者精度等)的代码
  15. 第二章 核心动画渲染框架
  16. HTML正方体滚动特效
  17. 解决CSDN访问速度慢的方法(绝对有效,无须修改hosts文件)
  18. mit计算机33门课程_440多门免费在线编程和计算机科学课程,您可以在2月开始
  19. 领导者必备的13个管理套路,用好了,下属死心塌地为你卖命
  20. ubuntu 安装opendr失败_安装软件失败求助

热门文章

  1. oracle管理员的作用,ORACLE数据库管理员的职责
  2. 声音模仿_澳洲这种鸟堪称“超级声音模仿秀”,比八哥还牛,却正遭山火毁灭...
  3. SQL:mysql将datetime类型数据格式化
  4. Vue源码:抽象语法树
  5. Django:查询结果新增一列、查询结果字段名称更改、多个字段模糊查询
  6. Javascript特效:瀑布流
  7. Oracle 11g ora 15018,OracleASM错误之--ORA-15031、ORA-15014
  8. Global.asax取绝对路径
  9. 机器学习课程笔记【十二】- 主成分分析
  10. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb4 in position 176: in xxxx