题目地址:https://leetcode.com/problems/online-election/description/

题目描述:

Inan election, the i-th vote was cast for persons[i] at time times[i].

Now, we would like to implement the following query function: TopVotedCandidate.q(int t) will return the number of the person that was leading the election at time t.

Votes cast at time t will count towards our query. In the case of a tie, the most recent vote (among tied candidates) wins.

Example 1:

Input: ["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]]
Output: [null,0,1,1,0,0,1]
Explanation: 
At time 3, the votes are [0], and 0 is leading.
At time 12, the votes are [0,1,1], and 1 is leading.
At time 25, the votes are [0,1,1,0,0,1], and 1 is leading (as ties go to the most recent vote.)
This continues for 3 more queries at time 15, 24, and 8.

Note:

1、 1<=persons.length=times.length<=5000;
2、 0<=persons[i]<=persons.length;
3、 timesisastrictlyincreasingarraywithallelementsin[0,10^9].;
4、 TopVotedCandidate.qiscalledatmost10000timespertestcase.;
5、 TopVotedCandidate.q(intt)isalwayscalledwitht>=times[0].;

题目大意

题目意思是在一个竞选中,在times[i]时刻会投票给persons[i],然后求t时刻的得票最多的候选人。注意,如果出现票数相等的情况,选择获得最新投票的那个。

解题方法

这个题很容易想到实现一个保存了当前出现次数最多数字的栈。类似的题目还有实现一个保存最小值的栈。

如果把这个题目这么抽象出来之后,会发现,只需要再增加一个二分查找代码就好了。

所以这个题使用List保存每个时间点对应的当前的获得票数最多的person。在q(t)中,使用二分查找到第一个小于t的times位置,然后返回这个位置对应的时间得票最多的person即可。

平均的时间复杂度是O(logn),空间复杂度是O(N).

代码如下:

class TopVotedCandidate(object):

    def __init__(self, persons, times):
        """
        :type persons: List[int]
        :type times: List[int]
        """
        self.leads, self.times, count = [], times, {}
        lead = -1
        for p, t in zip(persons, times):
            count[p] = count.get(p, 0) + 1
            if count.get(lead, 0) <= count[p]:
                lead = p
            self.leads.append(lead)
            
    def q(self, t):
        """
        :type t: int
        :rtype: int
        """
        l, r = 0, len(self.times) - 1
        while l <= r:
            mid = (l + r) // 2
            if self.times[mid] == t:
                return self.leads[mid]
            elif self.times[mid] > t:
                r = mid - 1
            else:
                l = mid + 1
        return self.leads[l - 1]
# Your TopVotedCandidate object will be instantiated and called as such:
# obj = TopVotedCandidate(persons, times)
# param_1 = obj.q(t)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

参考资料:

https://leetcode.com/problems/online-election/discuss/173382/C++JavaPython-Binary-Search-in-Times

DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有

本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发