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;
}
}
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;
}
}
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;
}
}