Leetcode-第157场周赛

5213.玩筹码

解法1:

本质是找奇数的个数和偶数的个数,输出较小值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int minCostToMoveChips(vector<int>& chips) {
int n=chips.size();
int ji=0,ou=0;
for(int i=0;i<n;i++)
{
if(chips[i]%2)
ji++;
else ou++;
}
return min(ji,ou);
}
};

5214.最长定差子序列

解法1:map

用map存当前元素的下个数值arr[i]+difference表示当前子序列的最大长度

以arr = [1,5,7,8,5,3,4,2,1], difference = -2为例

1的下一个子序列数字应该-1,我们存m[-1]=max(m[-1],m[1]+1);

5的下一个子序列数字应该3,我们存m[3]=max(m[3],m[5]+1);

7的下一个子序列数字应该5,我们存m[5]=max(m[5],m[7]+1);

8的下一个子序列数字应该6,我们存m[6]=max(m[6],m[8]+1);

5的下一个子序列数字应该3,我们存m[3]=max(m[3],m[5]+1);

3的下一个子序列数字应该1,我们存m[1]=max(m[1],m[3]+1);

依次类推,找到map中存的最大数值就是要返回的最大子序列长度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
int longestSubsequence(vector<int>& arr, int difference) {
map<int,int> m;
int n=arr.size();
for(int i=0;i<n;i++)
{
m[arr[i]+difference]=max(m[arr[i]]+1,m[arr[i]+difference]);
}
int res=INT_MIN;
for(map<int,int>::iterator ite=m.begin();ite!=m.end();ite++)
{
res=max(res,ite->second);
}
return res;
}
};

5215.黄金矿工

解法1:dfs

因为数据量很小,所以可以采用dfs来解决该题。

用一个used记录走过的点,temp记录当前获得黄金,dir是4个行进方向

注意跳过为0的点

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
class Solution {
int res=INT_MIN;
int n,m;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
public:
int getMaximumGold(vector<vector<int>>& grid) {
n=grid.size(),m=grid[0].size();
int temp=0;
vector<vector<bool>> used(n,vector<bool>(m,false));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(grid[i][j]==0)
continue;
used[i][j]=true;
temp=temp+grid[i][j];
res=max(res,temp);
dfs(i,j,temp,grid,used);
temp=temp-grid[i][j];
used[i][j]=false;
}
}
return res;
}
void dfs(int i,int j,int temp,vector<vector<int>>& grid,vector<vector<bool>>& used)
{
for(int k=0;k<4;k++)
{
int x=dir[k][0]+i,y=dir[k][1]+j;
if(x>=0&&x<n&&y>=0&&y<m&&!used[x][y]&&grid[x][y]!=0)
{
used[x][y]=true;
temp=temp+grid[x][y];
dfs(x,y,temp,grid,used);
res=max(res,temp);
temp=temp-grid[x][y];
used[x][y]=false;
}
}
return ;
}
};

5216.统计元音字母序列的数目

解法1:map

map 存当前长度下以这种字母结尾的字符串个数

注意一个公式(a+b)%c=(a%c+b%c)%c;

最后找到长度为n的各字母结尾的字符串相加取余。

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
class Solution {
public:
int countVowelPermutation(int n) {
long long res;
long long mod=(pow(10,9)+7);
map<char,long long> m;
m['a']=1;
m['e']=1;
m['i']=1;
m['o']=1;
m['u']=1;
map<char,long long> mnew;
while(n-->1)
{
mnew['a']=(m['e']%mod+m['i']%mod+m['u']%mod)%mod;
mnew['e']=(m['a']%mod+m['i']%mod)%mod;
mnew['i']=(m['e']%mod+m['o']%mod)%mod;
mnew['o']=m['i']%mod;
mnew['u']=(m['o']%mod+m['i']%mod)%mod;
m['o']=mnew['o'];
m['i']=mnew['i'];
m['a']=mnew['a'];
m['e']=mnew['e'];
m['u']=mnew['u'];
}
res=(m['a']%mod+m['e']%mod+m['i']%mod+m['o']%mod+m['u']%mod)%mod;
return res;
}
};