解题思路:
三重遍历所有情况。判断三元组是否满足条件。
代码展示:
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; } };
|
解题思路:
将数组转换成链表,模拟游戏过程。
代码展示:
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; } } } };
|
解题思路:
统计每行末尾有几个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(); 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; } } 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; } };
|
解题思路:
按数组建图,在图上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,有思路,一开始思路有点问题,写的不是很熟练。