Leetcode周赛284(待补)
找出数组中的所有 K 近邻下标
thinking
简单模拟
solution
class Solution {
public:
vector<int> findKDistantIndices(vector<int>& nums, int key, int k) {
vector<int> ans;
int n=nums.size();
vector<int> vis(n,0);
for(int i=0;i<n;++i) {
if(key==nums[i]) {
int left=i;int right=i;
while(left>=0) {
if(i-left<=k) vis[left]=1;
else break;
--left;
}
while(right<n) {
if(right-i<=k) vis[right]=1;
else break;
++right;
}
}
}
for(int i=0;i<n;++i) {
if(vis[i]) ans.push_back(i);
}
return ans;
}
};
统计可以提取的工件
thinking
统计每一个工件有没有全被挖出来即可
solution
class Solution {
public:
int digArtifacts(int n, vector<vector<int>>& a, vector<vector<int>>& dig) {
int ans=0;
vector<vector<int>> vis(n,vector<int>(n,0));
for(auto &d:dig) {
vis[d[0]][d[1]]=1;
}
for(auto &x:a) {
bool ok=true;
int x1=x[0],y1=x[1],x2=x[2],y2=x[3];
for(int i=x1;i<=x2;++i)
for(int j=y1;j<=y2;++j)
if(vis[i][j]!=1) ok=false;
if(ok) ++ans;
}
return ans;
}
};
K 次操作后最大化顶端元素
thinking
贪心+分类讨论(此处参考)
如果,数组元素为1,那么k等于奇数,就一定会空数组。如果k为偶数,那么数组停留的就会是\(nums[0]\)
否则,我们如此考虑
- 取走前k-1个数,取最大值放回
- 第k+1个数
- 注意,第k位的数,一定不会出现在栈顶
读者会考虑到k大于n的情况,我们不妨将数组取完,然后通过加入取出消耗k,最后,将最大的元素放入栈内即可。
solution
int maximumTop(vector<int>& nums, int k) {
int n=nums.size();
if(n==1&&(k&1)) return -1;
int maxnum=0;
for(int i=0;i<n&&i+1<k;++i) {
//查询前k-1个的最大值
maxnum=max(maxnum,nums[i]);
}
if(k<n) {
maxnum=max(maxnum,nums[k]);//与第k+1个数进行比较
}
return maxnum;
}
得到要求路径的最小带权子图
thinking
最短路 枚举 参考
(最短路我竟然不会手写。。。先去进修反思了)
solution

浙公网安备 33010602011771号