leetcode 周赛146

题目链接:https://leetcode-cn.com/contest/weekly-contest-146/

5130. 等价多米诺骨牌对的数量

排序一下,相邻判断相等,然后用C(n,2)计算一下。

class Solution {
    struct node
    {
        int u,v;
        bool operator <(const node& a)const
        {
            return u==a.u? v>& dominoes) {
        for(int i=0;i t=dominoes[i];
            p[i].u=t[0];
            p[i].v=t[1];
            if(p[i].u>p[i].v)
                swap(p[i].u,p[i].v);
        }
        sort(p,p+dominoes.size());
        int ans=0,s=1;
        for(int i=1;i

5132. 颜色交替的最短路径

bfs,记忆化一下。

class Solution {
    struct node
    {
        int step,u,col;
    }p;
public:
    vector shortestAlternatingPaths(int n, vector>& red_edges, vector>& blue_edges) {
        queue q;
        bool vis[405][2];
        memset(vis,0,sizeof vis);
        int inf = 0x3f3f3f3f;
        int dis[405][2];
        for(int i=0;i t:blue_edges)
                {
                    if(t[0]==top.u)
                    {
                        p.step=top.step+1;
                        p.u=t[1];
                        p.col=1;
                        q.push(p);
                    }
                }
            }
            else
            {
                for(vector t:red_edges)
                {
                    if(t[0]==top.u)
                    {
                        p.step=top.step+1;
                        p.u=t[1];
                        p.col=0;
                        q.push(p);
                    }
                }
            }
        }
        vector ans;
        for(int i=0;i

5131. 叶值的最小代价生成树

分析题目,可以看出来就是一个石子合并题目,只不过计算规则变了。我们可以用一个maxx[i][j]维护区间(i,j)内的最大值。

class Solution {
public:
    int mctFromLeafValues(vector& arr) {
        int n=arr.size();
        long long maxx[45][45];
        long long dp[45][45];
        long long inf=0x3f3f3f3f3f3fLL;
        for(int i=0;i

5133. 绝对值表达式的最大值

大力分类讨论。O(n)

以下i

1,arr1[i]

我们可以合并为一个数组:dis[i]=arr1[i]+arr2[i]+i;

计算用后面的减去前面的,下标的影响为正,表达式值不变。

2,arr1[i]>arr1[j] && arr2[i]>arr2[j]

我们可以合并为一个数组:dis[i]=arr1[i]+arr2[i]-i;

计算用前面的减去后面的,下标的影响为负。

3,arr1[i]arr2[j]

我们可以合并为一个数组:dis[i]=arr1[i]-arr2[i]+i;

计算用后面的减去前面的,下标的影响为正,表达式值不变。

4,arr1[i]>arr1[j] && arr2[i]

我们可以合并为一个数组:dis[i]=arr1[i]-arr2[i]-i;

计算用前面的减去后面的,下标的影响为负。

计算dis差值时可以用前缀和和后缀和的思想,这样复杂度为On。

class Solution {
public:
    int maxAbsValExpr(vector& arr1, vector& arr2) {
        int MAXN = 40005;
        int n=arr1.size();
        int ans=0;
        int pre[MAXN],suf[MAXN];
        int dis[MAXN];
        for(int i=0;i=0;i--)
            suf[i]=max(suf[i+1],dis[i]);
        for(int i=0;i=0;i--)
            suf[i]=min(suf[i+1],dis[i]);
        for(int i=0;i=0;i--)
            suf[i]=max(suf[i+1],dis[i]);
        for(int i=0;i=0;i--)
            suf[i]=min(suf[i+1],dis[i]);
        for(int i=0;i

 

你可能感兴趣的:(leetcode)