个人练习-Leetcode-1942. The Number of the Smallest Unoccupied Chair
Posted Rstln
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了个人练习-Leetcode-1942. The Number of the Smallest Unoccupied Chair相关的知识,希望对你有一定的参考价值。
题目链接:https://leetcode.cn/problems/the-number-of-the-smallest-unoccupied-chair/
题目大意:给出一群人到达一个排队的时间和离开派对的时间[arr, lev]
。有无数个座位,下标从0开始。当一个人在tm
时刻离开时,如果一个人在tm
及其以后的时刻到达,那么他可以坐离开的人的座位。每个人会优先挑选下标最小的座位。给出一个targetFriend,求这个人坐到的座位号。【题目保证每个人到达的时间是不同的】
思路:首先,对于每个人的处理肯定是按照到达时间的先后顺序,我们要考虑的那个人的时间假设为arr_i
,那么实际上arr_i
之后到达的人就根本没必要去考虑了。因此,先把arr_i
以及之前到达的人找出来,再按照时间顺序排序。
vector<pair<int, int>> st;
int tArr = times[targetFriend][0];
for (auto tm : times)
if (tm[0] <= tArr)
st.push_back(make_pair(tm[0], tm[1]));
随后,对这群需要处理的人遍历即可。(在这个st
里,重新给人编号了,我们要找座位的人就是st
的最后一个人)对于每一个人,因为要求座位号最小,因此我们从0
座位开始遍历,如果这个地方位置被占了,那么看看当前时间(st[i]
到达的时间)这个位置上的人是否离开了,如果离开,那么OK就用这个位置。如果这个地方位置没被占,那也OK就用这个位置。
其中occ[]
记录该位置上坐的上一个人,如果是-1
表示还没有被坐过。
for (int i = 0; i < st.size(); i++)
int pos = 0;
int now = st[i].first;
while (occ[pos] != -1)
if (now >= st[occ[pos]].second)
break;
pos++;
occ[pos] = i;
if (i == st.size()-1)
ret = pos;
记录最后一个人(我们的目标)坐的座位,返回即可。
完整代码:
bool cmp(pair<int, int> x, pair<int, int> y)
return x.first < y.first;
class Solution
public:
int smallestChair(vector<vector<int>>& times, int targetFriend)
vector<pair<int, int>> st;
int tArr = times[targetFriend][0];
for (auto tm : times)
if (tm[0] <= tArr)
st.push_back(make_pair(tm[0], tm[1]));
int occ[100001];
memset(occ, -1, sizeof(occ));
sort(st.begin(), st.end(), cmp);
int ret = -1;
for (int i = 0; i < st.size(); i++)
int pos = 0;
int now = st[i].first;
while (occ[pos] != -1)
if (now >= st[occ[pos]].second)
break;
pos++;
occ[pos] = i;
if (i == st.size()-1)
ret = pos;
return ret;
;
LeetCode.997-找到镇法官(Find the Town Judge)
这是悦乐书的第373次更新,第400篇原创
01 看题和准备
今天介绍的是LeetCode
算法题中Easy
级别的第234
题(顺位题号是997
)。在一个城镇,有N
个人从1到N
标记。有传言说其中一个人是秘密的镇法官。
如果镇法官存在,那么:
镇法官不信任任何人。
每个人(镇法官除外)都信任镇法官。
只有一个人满足前两条。
给定一个trust
数组,一对trust[i] = [a,b]
表示被标记为a
的人信任标记为b
的人。
如果镇法官存在并且可以识别,则返回镇法官的标签。否则,返回-1。
例如:
输入:N = 2,trust = [[1,2]]
输出:2
输入:N = 3,trust = [[1,3],[2,3]]
输出:3
输入:N = 3,trust = [[1,3],[2,3],[3,1]]
输出:-1
输入:N = 3,trust = [[1,2],[2,3]]
输出:-1
输入:N = 4,trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]
输出:3
注意:
1 <= N <= 1000
trust.length <= 10000
trust[i]都是不同的。
trust[i][0] != trust[i][1]
1 <= trust[i][0],trust[i][1] <= N
02 第一种解法
将题目翻译一下就是,法官的被信任次数等于N-1
,并且法官不能信任其他人,即法官是trust
数组中trust[i][1]
出现次数等于N-1
的人(被信任次数等于N-1
),并且trust[i][0]
不等于法官所在的标签(法官不能信任其他人)。
思路:利用HashMap
记录被信任人出现的次数,找出其中被信任了N-1
次的人,然后去trust
数组中判断此人是否有信任过其他人。有种特殊情况是N
为1的时候,trust
为空数组,即只有1个人,那么这个人就是法官。
public int findJudge(int N, int[][] trust)
// 只有1个人的时候,法官就是他本人
if (N == 1)
return N;
// key为被信任的人,value为其被信任的次数
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int[] arr : trust)
map.put(arr[1], map.getOrDefault(arr[1], 0)+1);
// 找到被信任次数等于N-1的那个人
int count = -1;
for (Integer key : map.keySet())
if (map.get(key) == N-1)
count = key;
// 被信任次数等于N-1的人,不能信任其他人
for (int[] arr : trust)
if (arr[0] == count)
return -1;
return count;
03 第二种解法
针对第一种解法中的HashMap
,我们还可以用int
数组进行替换,思路和上面第一种解法一致。
public int findJudge2(int N, int[][] trust)
if (N == 1)
return N;
int[] trusted = new int[N+1];
for (int i=0; i<trust.length; i++)
trusted[trust[i][1]]++;
int count = -1;
for (int i=0; i<trusted.length; i++)
if (trusted[i] == N-1)
count = i;
for (int[] arr : trust)
if (arr[0] == count)
return -1;
return count;
04 第三种解法
针对第二种解法,我们还可以将其简化成2个for
循环,将统计被信任次数和寻找被信任次数最多的人合在一起处理。
public int findJudge3(int N, int[][] trust)
if (N == 1)
return N;
int[] trusted = new int[N+1];
int count = -1, num = -1;
for (int i=0; i<trust.length; i++)
trusted[trust[i][1]]++;
if (trusted[trust[i][1]] > count)
count = trusted[trust[i][1]];
num = trust[i][1];
// 被信任次数要等于N-1
if (count != N-1)
return -1;
for (int[] arr : trust)
if (arr[0] == num)
return -1;
return num;
05 第四种解法
我们还可以使用两个int数组来解,一个数组arr存信任的人,另一个数组arr2
存被信任的人,找出被信任次数等于N-1
(arr2[i]=N-1
)且没有信任过人(arr[i]=0
)的人,他就是法官。
public int findJudge4(int N, int[][] trust)
int[] arr = new int[N+1];
int[] arr2 = new int[N+1];
for (int i=0; i<trust.length; i++)
arr[trust[i][0]]++;
arr2[trust[i][1]]++;
for (int j=1; j<arr.length; j++)
if (arr[j] == 0 && arr2[j] == N-1)
return j;
return -1;
06 小结
算法专题目前已连续日更超过七个月,算法题文章240+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
以上是关于个人练习-Leetcode-1942. The Number of the Smallest Unoccupied Chair的主要内容,如果未能解决你的问题,请参考以下文章
2018沈阳现场赛kLet the Flames Begin
Codeforces Round #503 (by SIS, Div. 1)第四题 the hat