LeetCode 第 212 场周赛(枚举、排序、极小化极大值(二分+搜索、贪心

5547. 等差子数组

class Solution {

public:

vector checkArithmeticSubarrays(vector& nums, vector& ls, vector& rs) {

vector ans;

for(int m=0;m<ls.size();m++){

int l = ls[m];

int r = rs[m];

vector v;

for(int i=l;i<=r;i++) v.push_back(nums[i]);

sort(v.begin(),v.end());

if(ok(v)){

ans.push_back(1);

}else{

ans.push_back(0);

}

}

return ans;

}

bool ok(const vector v){

int dif = v[1]-v[0];

for(int i=1;i<v.size();i++){

if(dif!=v[i]-v[i-1]) return false;

}

return true;

}

};

5548. 最小体力消耗路径

零神道题的题解确实很赞!

  • 最短路算法Dijkstra

const int dx[] = {0,1,0,-1},dy[] = {1,0,-1,0};

class Solution {

public:

typedef pair<int,int> P;

int id(int x,int y){

return x*101+y;

}

P get(int id){

return P(id/101,id-id/101*101);

}

int d[11000], m, n ;

bool vis[11000] = {0};

int minimumEffortPath(vector<vector>& g) {

memset(d,0x3f,sizeof(d));

m = g.size();

n = g[0].size();

d[id(0,0)]= 0;

priority_queue<P,vector

,greater

> pq;

pq.push(P(d[0],id(0,0)));

while(!pq.empty()){

P p = pq.top();

pq.pop();

int x = get(p.second).first;

int y = get(p.second).second;

// cout<<x<<" "<<y<<endl;

if(vis[p.second]) continue;

vis[p.second] = 1;

for(int k=0;k<4;k++){

int nx = x+dx[k];

int ny = y+dy[k];

if(nx>=0 && nx<m && ny>=0 && ny<n && !vis[id(nx,ny)]){

if( d[ id(nx,ny) ] > max( abs(g[x][y]-g[nx][ny]) , p.first ) ){

d[ id(nx,ny) ] = max( abs(g[x][y]-g[nx][ny]) , p.first );

pq.push(P(d[ id(nx,ny) ],id(nx,ny)));

}

}

}

}

return d[id(m-1,n-1)];

}

};

  • 极小化极大值(二分 + DFS)

const int dx[] = {0,1,0,-1},dy[] = {1,0,-1,0}, N = 11000;

class Solution {

public:

int m, n ;

bool vis[110][110];

vector<vector> g;

int minimumEffortPath(vector<vector>& G) {

g = G;

m = g.size();

n = g[0].size();

int l = 0, r = 1e6;

while(l<r){

int mid = l+(r-l)/2;

memset(vis,0,sizeof(vis));

if(dfs(0,0,mid)){

r = mid;

}else{

l = mid + 1;

}

}

return l;

}

bool dfs(int x,int y,int lim){

vis[x][y] = 1;

if(xm-1 && yn-1) return true;

for(int k=0;k<4;k++){

int nx = x + dx[k];

int ny = y + dy[k];

if(nx>=0 && nx<m && ny>=0 && ny<n && !vis[nx][ny]){

if(abs(g[x][y]-g[nx][ny]) <= lim){

if(dfs(nx,ny,lim)) return true;

}

}

}

return false;

}

};

  • 贪心+并查集

由于代价是按照选择边权的那一条边权决定的,换言之,比它小的边权都可以使用。

此时边(双向边)按照边权从小到大排序,然后一直加边加到 ( 0 , 0 ) (0,0) (0,0) ( m − 1 , n − 1 ) (m-1,n-1) (m−1,n−1)连通为止。

class Solution {

vector<vector> g;

struct Edge{

int x1,y1,x2,y2;

int val;

Edge(int x1,int y1,int x2,int y2,int val):x1(x1),y1(y1),x2(x2),y2(y2),val(val){}

bool operator<(const Edge& b){

return val<b.val;

}

};

class UF{

static const int N = 10100;

int f[N];

public:

UF(){

for(int i=0;i<N;i++) f[i] = i;

}

int find(int x){

return x==f[x]?x:f[x]=find(f[x]);

}

bool isConnected(int x,int y){

return find(x) == find(y);

}

void merge(int x,int y){

f[find(x)] = find(y);

}

};

int id(int x,int y){

return x*100+y;

}

难道这样就够了吗?不,远远不够!

提前多熟悉阿里往年的面试题肯定是对面试有很大的帮助的,但是作为技术性职业,手里有实打实的技术才是你面对面试官最有用的利器,这是从内在散发出来的自信。

备战阿里时我花的最多的时间就是在学习技术上,占了我所有学习计划中的百分之70,这是一些我学习期间觉得还是很不错的一些学习笔记

我为什么要写这篇文章呢,其实我觉得学习是不能停下脚步的,在网络上和大家一起分享,一起讨论,不单单可以遇到更多一样的人,还可以扩大自己的眼界,学习到更多的技术,我还会在csdn、博客、掘金等网站上分享技术,这也是一种学习的方法。

今天就分享到这里了,谢谢大家的关注,以后会分享更多的干货给大家!

阿里一面就落马,恶补完这份“阿里面试宝典”后,上岸蚂蚁金服

阿里一面就落马,恶补完这份“阿里面试宝典”后,上岸蚂蚁金服

image.png

最多的时间就是在学习技术上,占了我所有学习计划中的百分之70,这是一些我学习期间觉得还是很不错的一些学习笔记

我为什么要写这篇文章呢,其实我觉得学习是不能停下脚步的,在网络上和大家一起分享,一起讨论,不单单可以遇到更多一样的人,还可以扩大自己的眼界,学习到更多的技术,我还会在csdn、博客、掘金等网站上分享技术,这也是一种学习的方法。

今天就分享到这里了,谢谢大家的关注,以后会分享更多的干货给大家!

[外链图片转存中…(img-hERntu17-1714413839869)]

[外链图片转存中…(img-DzSuiQKs-1714413839869)]

[外链图片转存中…(img-59PCH3ZH-1714413839870)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值