• 997. Find the Town Judge


    use std::collections::{HashMap, HashSet};
    
    /**
    997. Find the Town Judge
    https://leetcode.com/problems/find-the-town-judge/
    
    In a town, there are n people labeled from 1 to n. There is a rumor that one of these people is secretly the town judge.
    If the town judge exists, then:
        1. The town judge trusts nobody.
        2. Everybody (except for the town judge) trusts the town judge.
        3. There is exactly one person that satisfies properties 1 and 2.
    You are given an array trust where trust[i] = [ai, bi] representing that the person labeled ai trusts the person labeled bi.
    Return the label of the town judge if the town judge exists and can be identified, or return -1 otherwise.
    
    Example 1:
    Input: n = 2, trust = [[1,2]]
    Output: 2
    
    Example 2:
    Input: n = 3, trust = [[1,3],[2,3]]
    Output: 3
    
    Example 3:
    Input: n = 3, trust = [[1,3],[2,3],[3,1]]
    Output: -1
    
    Constraints:
    1. 1 <= n <= 1000
    2. 0 <= trust.length <= 10^4
    3. trust[i].length == 2
    4. All the pairs of trust are unique.
    5. ai != bi
    6. 1 <= ai, bi <= n
    */
    
    pub struct Solution {}
    
    impl Solution {
        /*
        Solution: HashMap+HashSet, Time:O(n), Space:O(n)
        */
        pub fn find_judge(n: i32, trust: Vec<Vec<i32>>) -> i32 {
            let count = trust.len();
            if (count == 0) {
                //check some corner case
                return if n == 1 { 1 } else { -1 };
            }
            let mut peoplesWillTrustAnother: HashSet<i32> = HashSet::new();
            let mut mappingForJudge: HashMap<i32, Vec<i32>> = HashMap::new();
            for i in 0..count {
                //[0] is can be trust other, there are should not be a Judge
                peoplesWillTrustAnother.insert(trust[i][0]);
                //key is someone and value is list of everyone who trusts that people
                let vec = mappingForJudge.entry(trust[i][1] as i32).or_insert(Vec::new());
                vec.push(trust[i][0]);
            }
            /*
            Checking for Judge:
            1. not in peoplesWillTrustAnother;
            2. has N-1 peoples trusts
            */
            for i in 1..n + 1 {
                if (peoplesWillTrustAnother.contains(&i)) {
                    continue;
                }
                //if mappingForJudge.get(&i) can decomposed to array
                if let Some(array) = mappingForJudge.get(&i) {
                    if (array.len() == (n - 1) as usize) {
                        return i;
                    }
                }
            }
            -1
        }
    }
  • 相关阅读:
    C++_重载、重写和重定义的区别
    C++静态库与动态库
    C++ 中重载运算符 “<” 及 friend属性
    C++中,关于#include<***.h>和#include"***.h"的区别
    static_cast, dynamic_cast, const_cast讨论
    浅析C++中static关键字
    C语言包含头文件时用引号和尖括号的区别
    vc实现透明位图,透明背景
    VS2008调试技巧——断点失效
    Spring解决循环依赖的理解
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/16011200.html
Copyright © 2020-2023  润新知