Leetcode-第158场周赛

1221. 分割平衡字符串

解法:

遍历一遍,记录R,L,R==L时同时清零且res++

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 balancedStringSplit(string s) {
int l=0,r=0;
int res=0;
int n=s.size();
for(int i=0;i<n;i++)
{
if(s[i]=='R')
r++;
else if(s[i]=='L')
l++;
if(r==l)
{
res++;
r=0;
l=0;
}
}
return res;
}
};

1222. 可以攻击国王的皇后

解法1:DFS

思路:

从国王出发,最多有8个皇后能攻击到国王,建立方向数组,8个方向都从国王走一遍,

1.遇到皇后记录位置且进行下一方向,

2.遇到边界进行下一方向

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
class Solution {
public:
vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
vector<vector<bool>> used(8,vector<bool>(8,false));
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
vector<vector<int>> res;
for(int i=0;i<queens.size();i++)
{
used[queens[i][0]][queens[i][1]]=true;
}
for(int k=0;k<8;k++)
{
int x=king[0],y=king[1];
while(x+dir[k][0]>=0&&x+dir[k][0]<8&&y+dir[k][1]>=0&&y+dir[k][1]<8)
{
x+=dir[k][0];
y+=dir[k][1];
if(used[x][y])
{
vector<int> temp;
temp.push_back(x);
temp.push_back(y);
res.push_back(temp);
break;
}
}
}
return res;
}
};

1223. 掷骰子模拟

解法1:动态规划

思路:采用动态规划策略

1.dp[n][i][l]表示掷第n次数字i-1连续出现l次能组成的最多序列数

2.状态转移方程

​ (1)如果当前数字j与上一数字k相同,对全部符合的l来说:dp[i][j][l+1]=dp[i-1][k][l];即数字j连续出现,当前情况数量等于上一轮连续掷出i-1次j的情况数量

​ (2)如果不相等,对全部符合的l来说:dp[i][j][1]+=dp[i-1][k][l];即数字j并非连续出现,等于上一轮掷出非数字j的所有情况和

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
45
46
47
class Solution {
public:
int dieSimulator(int n, vector<int>& rollMax) {
int dp[n+1][6][20];
memset(dp,0,sizeof(dp));
int mod=pow(10,9)+7;
for(int i=0;i<6;i++)
{
dp[1][i][1]=1;
}
for(int i=2;i<=n;i++)
{
for(int j=0;j<6;j++)
{
for(int k=0;k<6;k++)
{
if(k!=j)
{
for(int l=1;l<=rollMax[k];l++)
{
dp[i][j][1]+=dp[i-1][k][l];
dp[i][j][1]%=mod;
}
}
else
{
for(int l=1;l<rollMax[k];l++)
{
dp[i][j][l+1]=dp[i-1][k][l];
dp[i][j][l+1]%=mod;
}
}
}
}
}
int res=0;
for(int j=0;j<6;j++)
{
for(int l=1;l<=rollMax[j];l++)
{
res+=dp[n][j][l];
res%=mod;
}
}
return res;
}
};

1224. 最大相等频率

解法1:map,考虑4种情况

问题分析:能够满足答案的条件

1.只有一种数字。 如:1 1 1 1 1

2.有多种数字,每个数字只出现1次。如: 1 2 3 4 5

3.有多种数字,其中一种数字出现n+1次,其他出现n次。如:1 1 1 2 2 2 3 3 3 4 4 4 4

4.有多种数字,其中一种数字出现1次,其他出现n次。如:1 2 2 2 3 3 3 4 4 4

建立两个数字count和f_count,count用来统计当前各个数字出现的次数,f_count[i]用来统计频率为i的数字个数。

因此成立的条件为,f_count[1]==n||最高频次==1||(f_count[最高频次]==1&&f_count[最高频次-1]==n-1)||f_count[最高频次]==(n-1)&&f_count[1]==1)

因此,需要两个变量,n表示有多少种数字,f_max表示最高频次为多少

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
int maxEqualFreq(vector<int>& nums) {
int count[100005],f_count[100005];
memset(count,0,sizeof(count));
memset(f_count,0,sizeof(f_count));
int n=0,f_max=0,res=0;
for(int i=0;i<nums.size();i++)
{
int num=nums[i];
if(count[num]==0)
n++;
count[num]++;
if(count[num])
f_count[count[num]-1]--;
f_count[count[num]]++;
f_max=max(f_max,count[num]);
if(f_count[1]==n||f_max==1||f_count[f_max]==1&&f_count[f_max-1]==n-1||f_count[f_max]==n-1&&f_count[1]==1)
res=i+1;
}
return res;
}
};