【Leetcode】911. Online Election

题目地址:

https://leetcode.com/problems/online-election/

给定两个长度都是 n n n的数组,一个数组 T T T代表时刻,是严格单调增的,另一个数组是 V V V V [ i ] V[i] V[i]代表某人在 T [ i ] T[i] T[i]时刻投票给的那个人。要求实现一个函数,可以询问某一时刻 t t t得票领先的人是谁。如果有两人得票相同,则取最近被投票的人。

可以直接求出 T [ i ] T[i] T[i]时刻得票领先的人的数组 A A A。询问的时候,先二分得出最后一个小于等于 t t t的时刻的下标,然后查询 A A A即可。代码如下:

import java.util.HashMap;
import java.util.Map;

public class TopVotedCandidate {
    
    
    
    // leader[i]存times[i]时刻领先的人是谁
    private int[] leader, times;
    
    public TopVotedCandidate(int[] persons, int[] times) {
    
    
        this.times = times;
        leader = new int[persons.length];
        Map<Integer, Integer> map = new HashMap<>();
        // v是在times[i]时刻领先的人的得票数
        for (int i = 0, v = 0; i < persons.length; i++) {
    
    
        	// 得票计数加1
            map.put(persons[i], map.getOrDefault(persons[i], 0) + 1);
            // 如果当前的人得票数大于等于v了,那么就产生了新的“优胜者”
            if (map.get(persons[i]) >= v) {
    
    
            	// 更新v和leader
                v = map.get(persons[i]);
                leader[i] = persons[i];
            } else {
    
    
            	// 否则说明当前的人没有“击败”上一时刻的优胜者,当前时刻的优胜者还是上一时刻的优胜者
                leader[i] = leader[i - 1];
            }
        }
    }
    
    public int q(int t) {
    
    
    	// 二分得到最后一个小于等于t的时刻
        int l = 0, r = times.length - 1;
        while (l < r) {
    
    
            int m = l + (r - l + 1 >> 1);
            if (times[m] <= t) {
    
    
                l = m;
            } else {
    
    
                r = m - 1;
            }
        }
        
        return leader[l];
    }
}

预处理时间复杂度 O ( n ) O(n) O(n),空间 O ( n ) O(n) O(n),每次询问时间复杂度 O ( log ⁡ n ) O(\log n) O(logn),空间 O ( 1 ) O(1) O(1)

猜你喜欢

转载自blog.csdn.net/qq_46105170/article/details/113078270