第九周作业记录
1871. 跳跃游戏 VII
题目描述:
给你一个下标从 0 开始的二进制字符串 s 和两个整数 minJump 和 maxJump 。一开始,你在下标 0 处,且该位置的值一定为 ‘0’ 。当同时满足如下条件时,你可以从下标 i 移动到下标 j 处:
i + minJump <= j <= min(i + maxJump, s.length - 1) 且
s[j] == ‘0’.
如果你可以到达 s 的下标 s.length - 1 处,请你返回 true ,否则返回 false 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/seat-reservation-manager
解题思路:
根据题意从下标0开始往后进行BFS,不过由于在搜索过程中会存在重复搜索的情况,因此通过引入limit进行记录最远搜索位置,以防止出现重复搜索
代码:
class Solution {
public:
bool canReach(string s, int minJump, int maxJump) {
int l = s.length();
vector<int> ans(l, 0);
if (s[l - 1] != '0') {
return false;
}
int limit = 0;
ans[0] = 1;
for (int i = 0; i < l; i++) {
if (ans[i] == 1) {
if (limit < i + minJump) {
limit = i + minJump;
}
for (int j = limit; j <= min(i + maxJump, l - 1); j++) {
if (s[j] == '0') {
ans[j] = 1;
}
}
limit = i + maxJump;
}
}
return ans[l - 1];
}
};
1845. 座位预约管理系统
题目描述:
请你设计一个管理 n 个座位预约的系统,座位编号从 1 到 n 。
请你实现 SeatManager 类:
SeatManager(int n) 初始化一个 SeatManager 对象,它管理从 1 到 n 编号的 n 个座位。所有座位初始都是可预约的。
int reserve() 返回可以预约座位的 最小编号 ,此座位变为不可预约。
void unreserve(int seatNumber) 将给定编号 seatNumber 对应的座位变成可以预约。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/seat-reservation-manager
解题思路:
采用最小堆排序
代码:
class SeatManager {
public:
vector<int> ans;
SeatManager(int n) {
for (int i = 0; i < n; i++) {
ans.push_back(i + 1);
}
}
int reserve() {
pop_heap(ans.begin(), ans.end(), greater<int>());
int temp = ans.back();
ans.pop_back();
return temp;
}
void unreserve(int seatNumber) {
ans.push_back(seatNumber);
push_heap(ans.begin(), ans.end(), greater<int>());
}
};
/**
* Your SeatManager object will be instantiated and called as such:
* SeatManager* obj = new SeatManager(n);
* int param_1 = obj->reserve();
* obj->unreserve(seatNumber);
*/