力扣第 306 场周赛复盘

目录

  • 1. 矩阵中的局部最大值
  • 题目描述
  • 题目分析
  • AC代码
  • 2. 边积分最高的节点
  • 题目描述
  • 题目分析
  • AC代码
  • 3. 根据模式串构造最小数字
  • 题目描述
  • 题目分析
  • AC代码
  • 4. 统计特殊整数
  • 题目描述
  • 题目分析
  • AC代码
  • 总结感想

1. 矩阵中的局部最大值

6148. 矩阵中的局部最大值

题目描述

力扣第 306 场周赛复盘_第1张图片
力扣第 306 场周赛复盘_第2张图片
力扣第 306 场周赛复盘_第3张图片
力扣第 306 场周赛复盘_第4张图片

题目分析

简单模拟题,这道题数据范围不大,所以只需要模拟即可

AC代码

class Solution {
public:
    int findmax(vector<vector<int>>& grid,int x,int y)
    {
        int cur=0;
        for(int i=x;i<x+3;i++)
            for(int j=y;j<y+3;j++)
                cur=max(cur,grid[i][j]);
        return cur;
    }
    vector<vector<int>> largestLocal(vector<vector<int>>& grid) {
        int n=grid.size();
        vector<vector<int>> res;
        for(int i=0;i<n-2;i++)
        {
            vector<int> tmp;
            for(int j=0;j<n-2;j++)
                tmp.push_back(findmax(grid,i,j));
            res.push_back(tmp);
        }
        return res;
    }
};

2. 边积分最高的节点

6149. 边积分最高的节点

题目描述

力扣第 306 场周赛复盘_第5张图片
力扣第 306 场周赛复盘_第6张图片
力扣第 306 场周赛复盘_第7张图片
力扣第 306 场周赛复盘_第8张图片

题目分析

只需要遍历一遍,将每个点的边积分求出来即可,然后求出最大值。
注意:不能用unordered_map这是无序的,注意longlong

AC代码

class Solution {
public:
    int edgeScore(vector<int>& edges) {
        map<int,long long> hash;
        for(int i=0;i<edges.size();i++)
            hash[edges[i]]+=i;
        
        int maxi=-1,maxn=-1;
        for(auto it:hash)
        {
            if(it.second>maxn)maxi=it.first,maxn=it.second;
        }
        return maxi;
    }
};

3. 根据模式串构造最小数字

6150. 根据模式串构造最小数字

题目描述

力扣第 306 场周赛复盘_第9张图片
力扣第 306 场周赛复盘_第10张图片
力扣第 306 场周赛复盘_第11张图片

题目分析

力扣第 306 场周赛复盘_第12张图片

思路:贪心
假设区间全是升序,那么我们从小到大排序即可
如果有降序呢?那么我们将应该降序的区间的升序全部变成降序即可。
这样可以保证所得的数字最小。

AC代码

class Solution {
public:
    string smallestNumber(string pattern) {
        int n=pattern.size();
        string res;
        for(int i=1;i<=n+1;i++)res+=i+'0';// 从小到大
        int pre=-1;
        for(int i=0;i<=n;i++)
        {
            if(pattern[i]=='I')pre=i;
            if(pattern[i]=='D'&&(i==n-1||pattern[i+1]!='D'))
            {
                int l=pre+1,r=i+1;// 找出交换区间
                if(i==n)r=i;
                while(l<r)swap(res[l],res[r]),l++,r--;// 交换
                i++;
                pre=i;
            }
        }
        return res;

    }
};

4. 统计特殊整数

6151. 统计特殊整数

题目描述

力扣第 306 场周赛复盘_第13张图片
力扣第 306 场周赛复盘_第14张图片

题目分析

数位DP,没有接触过,后续补充

AC代码

总结感想

前两道题都是比较简单,第三题当时想到方法,但是实现有bug找了半天,而且其实代码也很杂,后续通过画图很轻松就知道怎么写了(以后要多画图),最后一道题其实一读就知道是数位DP,但是自己不会(其实碰到很多次,都没认真做过)。
多刷题,多总结,多画图,多反思!!!

你可能感兴趣的:(力扣周赛,leetcode,算法,哈希算法)