A.统计好三元组

解题思路:
三重遍历所有情况。判断三元组是否满足条件。
代码展示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
int countGoodTriplets(vector<int>& arr, int a, int b, int c) {
int ans=0,n=arr.size();
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
for(int k=j+1;k<n;k++){
if(fabs(arr[i]-arr[j])<=a && fabs(arr[j]-arr[k])<=b&&fabs(arr[k]-arr[i])<=c)
ans++;
}
}
}
return ans;
}
};

B.找出数组游戏的赢家

解题思路:
将数组转换成链表,模拟游戏过程。
代码展示:

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
struct node{
int v;
node *next;
node(int x){v=x;next=nullptr;}
};
class Solution {
public:
int getWinner(vector<int>& arr, int k) {
int n=arr.size();
if(k>n){
int maxv=0;
for(int i=0;i<n;i++) maxv=max(maxv,arr[i]);
return maxv;
}
node *root = new node(arr[0]);
node *p;p=root;
for(int i=1;i<n;i++){
node *q = new node(arr[i]);
p->next=q;
p=q;
}
int t=0;
while(true){
if(t==k){
return root->v;
}
node *q=root->next;
if(root->v > q->v){
t++;
p->next = q;
root->next = q->next;
p = p->next;
}else{
t=1;
p->next = root;
root = q;
p = p->next;
}
}
}
};

C.排布二进制网格的最少交换次数

解题思路:
统计每行末尾有几个0。从0行开始,判断每一行的尾0是否满足,不满足则从后面找到最先满足的一行一行交换上来,同时ans++。最后判断网格是否满足上三角,不满足输入-1,满足输出ans。
代码展示:

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
class Solution {
public:
int minSwaps(vector<vector<int>>& grid) {
int n = grid.size();
//cout<<n<<endl;
vector<int> zenum(n,0);
for(int i=0;i<n;i++){
for(int j=n-1;j>=0;j--){
if(grid[i][j]==0) zenum[i]++;
else break;
}
}
// for(int i=0;i<n;i++) cout<<zenum[i]<<" ";
// cout<<endl;
int ans=0;
for(int i=0;i<n;i++){
if(zenum[i]>=n-1-i) continue;
for(int j=i+1;j<n;j++){
if(zenum[j]>=n-i-1){
for(int k=j;k!=i;k--){
swap(zenum[k],zenum[k-1]);
ans++;
}
break;
}
}
}
for(int i=0;i<n;i++){
if(zenum[i]<n-1-i)
return -1;
}
return ans;
}
};

D.最大得分

解题思路:
按数组建图,在图上dfs。
代码展示:

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#define mymax(a,b)(a>b?a:b)
typedef long long ll;
const int maxn=2e5+50;
const int mod=1e9+7;

struct Edge{
int to,next;
}edges[maxn<<2];

int n,tot,head[maxn],w[maxn];
ll dp[maxn];

void addedge(int u,int v){
++tot;
edges[tot].to=v;
edges[tot].next=head[u];
head[u]=tot;
}

ll dfs(int u){
if(dp[u]) return dp[u];
ll ans=0;
for(int i=head[u];i;i=edges[i].next){
int v=edges[i].to;
ans=mymax(ans,dfs(v));
}
return dp[u]=ans+w[u];
}

void init(){
memset(edges,0, sizeof(edges));
memset(w,0,sizeof(w));
memset(dp,0,sizeof(dp));
memset(head,0,sizeof(head));
n=tot=0;
}

class Solution {
public:
int maxSum(vector<int>& nums1, vector<int>& nums2) {
init();
unordered_map<int,int> getid;
int cnt=0;
for(int e:nums1){
if(!getid[e]){
getid[e]=++cnt;
w[cnt]=e;
}
}
for(int e:nums2){
if(!getid[e]){
getid[e]=++cnt;
w[cnt]=e;
}
}
n=cnt;
int len1=nums1.size();
int len2=nums2.size();
for(int i=0;i+1<len1;++i){
int u=getid[nums1[i]],v=getid[nums1[i+1]];
addedge(u,v);
}
for(int i=0;i+1<len2;++i){
int u=getid[nums2[i]],v=getid[nums2[i+1]];
addedge(u,v);
}
ll ans=mymax(dfs(getid[nums1[0]]),dfs(getid[nums2[0]]));
return ans%mod;
}
};

做题情况:
AC 三题
排名:792 / 5475
总结反思:
排名很差,第四题比赛内没有AC,有思路,一开始思路有点问题,写的不是很熟练。