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;
}
};
零神道题的题解确实很赞!
- 最短路算法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、博客、掘金等网站上分享技术,这也是一种学习的方法。
今天就分享到这里了,谢谢大家的关注,以后会分享更多的干货给大家!
最多的时间就是在学习技术上,占了我所有学习计划中的百分之70,这是一些我学习期间觉得还是很不错的一些学习笔记
我为什么要写这篇文章呢,其实我觉得学习是不能停下脚步的,在网络上和大家一起分享,一起讨论,不单单可以遇到更多一样的人,还可以扩大自己的眼界,学习到更多的技术,我还会在csdn、博客、掘金等网站上分享技术,这也是一种学习的方法。
今天就分享到这里了,谢谢大家的关注,以后会分享更多的干货给大家!
[外链图片转存中…(img-hERntu17-1714413839869)]
[外链图片转存中…(img-DzSuiQKs-1714413839869)]
[外链图片转存中…(img-59PCH3ZH-1714413839870)]