Leetcode第136场双周赛题解(c++)

题外话

也是好久没有更新力扣比赛的题解了,前段时间也是比较忙(说的好像现在不忙一样哈哈),像我等菜鸟,一般都是保二进三四不写的,笑死。

题目一.求出胜利玩家的数目

给你一个整数 n ,表示在一个游戏中的玩家数目。同时给你一个二维整数数组 pick ,其中 pick[i] = [xi, yi] 表示玩家 xi 获得了一个颜色为 yi 的球。

如果玩家 i 获得的球中任何一种颜色球的数目 严格大于 i 个,那么我们说玩家 i 是胜利玩家。换句话说:

  • 如果玩家 0 获得了任何的球,那么玩家 0 是胜利玩家。
  • 如果玩家 1 获得了至少 2 个相同颜色的球,那么玩家 1 是胜利玩家。
  • ...
  • 如果玩家 i 获得了至少 i + 1 个相同颜色的球,那么玩家 i 是胜利玩家。

请你返回游戏中 胜利玩家 的数目。

注意,可能有多个玩家是胜利玩家。

示例 1:

**输入:**n = 4, pick = \[0,0,1,0,1,0,2,1,2,1,2,0]

**输出:**2

解释:

玩家 0 和玩家 1 是胜利玩家,玩家 2 和玩家 3 不是胜利玩家。

示例 2:

**输入:**n = 5, pick = \[1,1,1,2,1,3,1,4]

**输出:**0

解释:

没有胜利玩家。

示例 3:

**输入:**n = 5, pick = \[1,1,2,4,2,4,2,4]

**输出:**1

解释:

玩家 2 是胜利玩家,因为玩家 2 获得了 3 个颜色为 4 的球。

提示:

  • 2 <= n <= 10
  • 1 <= pick.length <= 100
  • pick[i].length == 2
  • 0 <= xi <= n - 1
  • 0 <= yi <= 10

思路

看到这个题,第一想法就是遍历pick\[\]数组了,然后vector<unordered_map<int,int> > colorCount(n)来记录玩家的颜色球数;最后遍历colorCount,输出某个颜色球数目大于i的个数;

cpp 复制代码
class Solution {
public:
    int winningPlayerCount(int n, vector<vector<int>>& pick) {
       vector<unordered_map<int,int> > colorCount(n);
       for(auto p:pick){
            int player=p[0];
            int color=p[1];
            colorCount[player][color]++;
       }
       int ans=0;
       for(int i=0;i<n;i++){
        for(auto entry:colorCount[i]) {
            if(entry.second>i) {
                ans++;
                break;
            }
        }
       }
       return ans;
    }
};

题目二.最少翻转次数使二进制矩阵回文

给你一个 m x n 的二进制矩阵 grid

如果矩阵中一行或者一列从前往后与从后往前读是一样的,那么我们称这一行或者这一列是 回文 的。

你可以将 grid 中任意格子的值 翻转 ,也就是将格子里的值从 0 变成 1 ,或者从 1 变成 0

请你返回 最少 翻转次数,使得矩阵 要么 所有行是 回文的 ,要么所有列是 回文的

示例 1:

**输入:**grid = \[1,0,0,0,0,0,0,0,1]

**输出:**2

解释:

将高亮的格子翻转,得到所有行都是回文的。

示例 2:

**输入:**grid = \[0,1,0,1,0,0]

**输出:**1

解释:

将高亮的格子翻转,得到所有列都是回文的。

示例 3:

**输入:**grid = \[1,0]

**输出:**0

解释:

所有行已经是回文的。

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m * n <= 2 * 105
  • 0 <= grid[i][j] <= 1

思路

要么行回文,要么列回文。分别求出行与列各需要多少翻转次数,return二者较小的结果即可。

cpp 复制代码
class Solution {
public:
    int minFlips(vector<vector<int>>& grid) {
        int m = grid.size();
        int n = grid[0].size();
        
        // 计算行需要的最小翻转次数
        int rowFlips = 0;
        for (int i = 0; i < m; ++i) {
            rowFlips += minFlipsForPalindrome(grid[i]);
        }
        
        // 计算列需要的最小翻转次数
        int colFlips = 0;
        for (int j = 0; j < n; ++j) {
            vector<int> column(m);
            for (int i = 0; i < m; ++i) {
                column[i] = grid[i][j]; // 构建当前列的数组
            }
            colFlips += minFlipsForPalindrome(column);
        }
        
        return min(rowFlips, colFlips);
    }
    
    int minFlipsForPalindrome(vector<int>& line) {
        int length = line.size();
        int flips = 0;
        // 比较前后半部分
        for (int i = 0; i < length / 2; ++i) {
            if (line[i] != line[length - 1 - i]) {
                flips++;
            }
        }
        return flips;
    }
};
相关推荐
KaMeidebaby17 分钟前
卡梅德生物技术快报|羊驼免疫:分子生物学实战:基于羊驼免疫的重链抗体制备与全流程验证方案
前端·网络·数据库·人工智能·算法·百度
oort12318 分钟前
AI+基层治理·智慧政务解决方案——AI民意速办智能助手
大数据·人工智能·算法·政务
渡之36 分钟前
GeoBridge 深度解析:语义锚定多视图基础模型,重塑无人机跨视角地理定位
深度学习·算法·动态规划·无人机
一口吃俩胖子39 分钟前
【脉宽调制DCDC功率变换学习笔记024】电压反馈补偿和环路增益
笔记·学习·算法
洛水水44 分钟前
【力扣100题】80.寻找旋转排序数组中的最小值
数据结构·算法·leetcode
ting94520001 小时前
VC Boom 技术架构与核心算法深度解
人工智能·算法·架构
无限码力1 小时前
美团研发岗 5月9号笔试真题 - 正整数矩阵
算法·美团笔试真题·美团研发岗笔试真题·美团0509笔试真题
Rabitebla1 小时前
C++ 多态详解:从概念到虚表底层原理(代码轰炸)
开发语言·c++
Smilecoc1 小时前
决策树(二):决策树的划分选择
算法·决策树·机器学习
charlie1145141911 小时前
通用GUI编程技术——图形渲染实战(五十)——命中测试与鼠标事件路由:精确交互
c++·windows·架构·交互·图形渲染