【Leetcode】第200场周赛

A.统计好三元组

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

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.找出数组游戏的赢家

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

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。
代码展示:

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。
代码展示:

#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,有思路,一开始思路有点问题,写的不是很熟练。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值