Leetcode-第164场周赛

1266. 访问所有点的最小时间

解法:切比雪夫距离

计算max(dx,dy)取较大值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int minTimeToVisitAllPoints(vector<vector<int>>& points) {
int res=0;
int n=points.size();
for(int i=1;i<n;i++)
{
int x=abs(points[i][0]-points[i-1][0]);
int y=abs(points[i][1]-points[i-1][1]);
res+=max(x,y);
}
return res;
}
};

1267. 统计参与通信的服务器

解法:

1.计算各列存在的服务器数量,各行服务器存在的数量,记录服务器的总数量sum

2.当该行该列服务器为1时,表示这个服务器没有连接,统计数量s_res

3.返回sum-s_res

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
int countServers(vector<vector<int>>& grid) {
int n=grid.size(),m=grid[0].size();
vector<int> col(m,0);
vector<int> row(n,0);
int sum=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
row[i]+=grid[i][j];
col[j]+=grid[i][j];
sum+=grid[i][j];
}
}
int s_res=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(row[i]==1&&col[j]==1&&grid[i][j])
s_res++;
}
}
return sum-s_res;
}
};

1268. 搜索推荐系统

解法:map

思路:

1.利用map存储产品,遍历每个产品数组字符串,将其产品各位数组成的前缀字符串,添加产品到map中,map的名就是前缀字符串

2.遍历searchword,在map中搜索各前缀字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Solution {
public:
vector<vector<string>> suggestedProducts(vector<string>& products, string searchWord) {
map<string,vector<string>> m;
int n=products.size();
for(int i=0;i<n;i++)
{
string t=products[i];
int size=t.size();
string temp="";
for(int j=0;j<size;j++)
{
temp+=t[j];
m[temp].push_back(t);
}
}
vector<vector<string>> res;
int len=searchWord.size();
string c="";
for(int i=0;i<len;i++)
{
c+=searchWord[i];
if(m.count(c))
{
sort(m[c].begin(),m[c].end());
if(m[c].size()>3)
{
vector<string> temp(m[c].begin(),m[c].begin()+3);
res.push_back(temp);
}
else
{
vector<string> temp(m[c].begin(),m[c].end());
res.push_back(temp);
}
}
else
{
res.push_back({});
}
}
return res;
}
};

1269. 停在原地的方案数

解法1:动态规划

1.dp[i][j]表示移动i步,停在j位置的总方案数

2.得到dp[i][j]=sum(dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1])

注意:判断steps和arrlen的关系,可以减少时间复杂度,可行位置必然不会超过steps的长度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
int numWays(int steps, int arrLen) {
int arrlen=min(steps,arrLen);
int mod=pow(10,9)+7;
vector<vector<long long>> dp(steps+1,vector<long long>(arrlen,0));
dp[0][0]=1;
for(int i=1;i<steps+1;i++)
{
for(int j=0;j<arrlen;j++)
{
dp[i][j]=dp[i-1][j];
if(j!=0)
dp[i][j]+=dp[i-1][j-1];
if(j!=arrlen-1)
dp[i][j]+=dp[i-1][j+1];
dp[i][j]%=mod;
}
}
return dp[steps][0]%mod;
}
};