题外话
也是好久没有更新力扣比赛的题解了,前段时间也是比较忙(说的好像现在不忙一样哈哈),像我等菜鸟,一般都是保二进三四不写的,笑死。
题目一.求出胜利玩家的数目
给你一个整数 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;
}
};