LeetCode 997. 找到小镇的法官 / 475. 供暖器 / 1154. 一年中的第几天

997. 找到小镇的法官

2021.12.19 每日一题

题目描述

小镇里有 n 个人,按从 1 到 n 的顺序编号。传言称,这些人中有一个暗地里是小镇法官。

如果小镇法官真的存在,那么:

小镇法官不会信任任何人。
每个人(除了小镇法官)都信任这位小镇法官。
只有一个人同时满足属性 1 和属性 2 。
给你一个数组 trust ,其中 trust[i] = [ai, bi] 表示编号为 ai 的人信任编号为 bi 的人。

如果小镇法官存在并且可以确定他的身份,请返回该法官的编号;否则,返回 -1 。

示例 1:

输入:n = 2, trust = [[1,2]]
输出:2

示例 2:

输入:n = 3, trust = [[1,3],[2,3]]
输出:3

示例 3:

输入:n = 3, trust = [[1,3],[2,3],[3,1]]
输出:-1

提示:

1 <= n <= 1000
0 <= trust.length <= 10^4
trust[i].length == 2
trust 中的所有trust[i] = [ai, bi] 互不相同
ai != bi
1 <= ai, bi <= n

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-town-judge
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

class Solution {
    public int findJudge(int n, int[][] trust) {
        //法官不会信任任何人
        //可以统计每个人信任和被信任的个数,如果有一个人信任别人0个,被信任n-1个,那么就是法官
        int l = trust.length;
        int[] trustoOthers = new int[n + 1];
        int[] beTrusted = new int[n + 1];
        for(int i = 0; i < l; i++){
            trustoOthers[trust[i][0]]++;
            beTrusted[trust[i][1]]++;
        }
        for(int i = 1; i <= n; i++){
            if(trustoOthers[i] == 0 && beTrusted[i] == n - 1)
                return i;
        }
        return -1;
    }
}

475. 供暖器

2021.12.20 每日一题

题目描述

冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。

在加热器的加热半径范围内的每个房屋都可以获得供暖。

现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。

说明:所有供暖器都遵循你的半径标准,加热的半径也一样。

示例 1:

输入: houses = [1,2,3], heaters = [2]
输出: 1
解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。

示例 2:

输入: houses = [1,2,3,4], heaters = [1,4]
输出: 1
解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。

示例 3:

输入:houses = [1,5], heaters = [2]
输出:3

提示:

1 <= houses.length, heaters.length <= 3 * 10^4
1 <= houses[i], heaters[i] <= 10^9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/heaters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

先排序,然后双指针

class Solution {
    public int findRadius(int[] houses, int[] heaters) {
        int m = houses.length;
        int n = heaters.length;
        //先排序
        Arrays.sort(houses);
        Arrays.sort(heaters);
        //对于每个房子来说,主要就是看离最近的供暖器
        int r = 0;
        int idx = 0;    //当前供暖器的下标
        for(int i = 0; i < m; i++){
            int pos = houses[i];
            //按顺序找比它位置大的供暖器
            while(idx < n && heaters[idx] < pos){
                idx++;
            }
            int tempr = 0;
            if(idx == 0)
                tempr = heaters[idx] - pos;
            else if(idx == n)
                tempr = pos - heaters[idx - 1];
            else  
                tempr = Math.min(heaters[idx] - pos, pos - heaters[idx - 1]);
            r = Math.max(r, tempr);
        }
        return r;
    }
}

1154. 一年中的第几天

2021.12.21 每日一题

题目描述

给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。请你计算并返回该日期是当年的第几天。

通常情况下,我们认为 1 月 1 日是每年的第 1 天,1 月 2 日是每年的第 2 天,依此类推。每个月的天数与现行公元纪年法(格里高利历)一致。

示例 1:

输入:date = “2019-01-09”
输出:9

示例 2:

输入:date = “2019-02-10”
输出:41

示例 3:

输入:date = “2003-03-01”
输出:60

示例 4:

输入:date = “2004-03-01”
输出:61

提示:

date.length == 10
date[4] == date[7] == ‘-’,其他的 date[i] 都是数字
date 表示的范围从 1900 年 1 月 1 日至 2019 年 12 月 31 日

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/day-of-the-year
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

因为所给的年份范围是在1900年到2019年,所以没有涉及到100的倍数这种世纪闰年的判断

class Solution {
    static int[] pre;
    static{
        pre = new int[12];
        for(int i = 1; i < 8; i++){
            if(i % 2 == 0)
                pre[i] = pre[i - 1] + 30;
            else
                pre[i] = pre[i - 1] + 31;
            if(i == 2)
                pre[i] -= 2; 
        }
        for(int i = 8; i < 12; i++){
            if(i % 2 == 1)
                pre[i] = pre[i - 1] + 30;
            else
                pre[i] = pre[i - 1] + 31;
        }
        
    }
    public int dayOfYear(String date) {
        //要想做对这道题,首先得回顾一下公元纪年的方法
        //对于2月,如果年份是4的倍数但不是100的倍数,那么就是29天
        //但是400倍数,仍是闰年
        int l = date.length();
        int year = Integer.parseInt(date.substring(0, 4));
        int month = Integer.parseInt(date.substring(5, 7));
        int day = Integer.parseInt(date.substring(8, 10));
        if(year % 4 == 0 && month > 2)
            return pre[month - 1] + day + 1;
        else
            return pre[month - 1] + day;
    }
}

你可能感兴趣的:(LeetCode,leetcode,java)