第一题
同一个数组来存储数组nums中key的下标。然后通过for循环找出符合题目条件的下标。
class Solution {
public:
vector<int> findKDistantIndices(vector<int>& nums, int key, int k) {
vector<int> ans;
for(int i = 0; i < nums.size(); i ++){
if(nums[i] == key)
ans.push_back(i);
}
vector<int> res;
int j = 0;
for(int i = 0; i < nums.size(); i ++){
if(j + 1 < ans.size() && i - ans[j] > k) j ++;
if(abs(i - ans[j]) <= k) res.push_back(i);
}
return res;
}
};
第二题
刚开始时看了半天都没有看懂题目的意思而且题目也有点长,唉,当时只能放弃了,没办法,我的耐心和阅读理解能力都有点差
后来看了一下题解,发现这题的意思是:给一个n,在nXn的二维数组中有一些工件,一个数组存放这些工件的起始位置和终止位置,还有一个数组存放的是可以挖掘的单元格,要统计可以挖掘工件的数量。看了一个数据可以直接暴力模拟。
看了题解学会了goto的用法。
代码:
class Solution {
public:
int digArtifacts(int n, vector<vector<int>>& artifacts, vector<vector<int>>& dig) {
vector<vector<int>> ans(n, vector<int>(n, 0));
for(auto i : dig){
int x = i[0], y = i[1];
ans[x][y] = 1;
}
int cnt = 0;
for(auto i : artifacts){
int x1 = i[0], y1 = i[1], x2 = i[2], y2 = i[3];
for(int j = x1; j <= x2; j ++){
for(int k = y1; k <= y2; k ++){
if(!ans[j][k])
goto go;
}
}
cnt ++;
go:;
}
return cnt;
}
};
第三题
分类讨论,当k == 0时只能返回num[0]
当nums.size() ==1时,对k奇偶进行讨论,为奇数说明进行k次操作后只能得到一个空栈,你们返回-1,否则可以返回nums[0].
当k>nums,size(),说明可以将nums中的所有元素都遍历一遍,然后找出其最大值。
当k<=nums.size(),此时不能将nums中的所有元素遍历一遍,只能遍历到k-2,找到其中最大的值或者一直进行出栈操作既得到nums[k],将其比较返回其最大值。
代码:
class Solution {
public:
int maximumTop(vector<int>& nums, int k) {
int res = 0;
if(k == 0) return nums[0];
if(nums.size() == 1){
if(k & 1) return -1;
return nums[0];
}
if(k > nums.size()){
for(int i = 0; i < nums.size(); i ++) res = max(res, nums[i]);
}
else{
for(int i = 0; i < k - 1; i ++) res = max(res, nums[i]);
res = max(res, nums[k]);
}
return res;
}
};
第四题:
图论现在对我来说太难了。。。。。