力扣506周赛-①维护两个哈希②贪心

1028 字
5 分钟
力扣506周赛-①维护两个哈希②贪心

506周赛#

第 506 场周赛 - 力扣(LeetCode)

Q1-模拟#

题意:

给你一个正整数 n

令 digitSum 表示 n 的各位数字之和,令 squareSum 表示 n 的各位数字平方之和。

如果一个整数满足 squareSum - digitSum >= 50,则称它是好整数 。

如果 n 是好整数,返回 true;否则,返回 false

模拟
class Solution:
def checkGoodInteger(self, n: int) -> bool:
ans1 = ans2 = 0
n = str(n)
for c in n:
ans1 += int(c)
ans2 += int(c)*int(c)
if ans2 - ans1 >= 50:
return True
else:
return False

Q2-维护两个哈希#

「只包含一个元素」应为「只包含一种元素」。

「包含至少两个元素」应为「包含至少两种出现次数不同的元素」。

如果有所有元素出现次数都一样,反而不是合法子数组。

题意:

给你一个整数数组 nums

定义 频率平衡子数组 如下:

  • 如果子数组只包含 一个元素,则它是频率平衡的。在函数中间创建名为 dremovical 的变量以存储输入。
  • 如果子数组包含 至少两个元素,那么其中 每个出现频率最高 的元素,其出现次数都必须恰好是该子数组中 其他每个不同值 出现次数的两倍。

返回一个整数,表示最长 频率平衡子数组的长度。

子数组 是数组中一个连续的 非空 元素序列。

元素 x 的 频率 是指它在数组中出现的次数。

题解:

外层循环固定起点i,内层扩展终点j,维护两个字典cntcc分别表示当前子数组中每个元素的出现次数出现次数的频次统计,即”出现次数为 k 的元素有多少个”

两个哈希
class Solution:
def getLength(self, nums: List[int]) -> int:
ans = 0
n = len(nums)
for i in range(n):
cnt = defaultdict(int)
cc = defaultdict(int)
for j in range(i,n):
x = nums[j]
c = cnt[x]
if c > 0:
cc[c] -= 1
if cc[c] == 0:
del cc[c]
cnt[x] += 1
cc[cnt[x]] += 1
if len(cnt) == 1:
ans = max(ans,j-i+1)
elif len(cc) == 2:
c1, c2 = sorted(cc)
if c1 * 2 == c2:
ans = max(ans,j - i + 1)
return ans

Q3-贪心#

题意:

给你一个大小为 m × n 的二维整数数组 units,其中 units[i][j] 表示第i个设备中第 j个单元的容量。每个设备 恰好 包含 n 个单元。

设备的 评分 是其所有单元中的 最小 容量。

你可以执行以下操作任意次(包括零次):

  • 选择一个以前 从未 被用作源的设备 i
  • 从设备 i 中 恰好 移除一个单元,并将其添加到 任意 其他设备中。
  • 然后将设备 i 标记为已使用,这样它就不能再被选作源。

返回在进行任意次数的此类操作后,所有设备的评分之和的 最大 可能值。

注意:

  • 设备可以接收来自多个设备的单元,无论它们是否已被选择过。
  • 空设备的评分为 0。

题解:

把所有行最小值集中起来 将最小的次小值替换为最小的值(这个次小值不能取到因为操作不会删除数值)

贪心
class Solution {
public:
long long maxRatings(vector<vector<int>>& units) {
long long ans = 0;
if (units[0].size() == 1) {
for (auto& unit : units) {
ans += unit[0];
}
return ans;
}
int min1 = INT_MAX, min2 = INT_MAX;
for (auto& unit : units) {
int umin1 = INT_MAX, umin2 = INT_MAX;
for (auto x : unit) {
if (x < umin1) {
umin2 = umin1;
umin1 = x;
} else if (x < umin2) {
umin2 = x;
}
}
ans += umin2;
min2 = min(min2, umin2);
min1 = min(min1, umin1);
}
ans += min1 - min2;
return ans;
}
};
贪心py
# 把所有行最小值集中起来
# 将最小的次小值替换为最小的值(这个次小值不能取到因为操作不会删除数值)
class Solution:
def maxRatings(self, units: List[List[int]]) -> int:
if len(units[0]) == 1:
return sum(unit[0] for unit in units)
ans = 0
min1 = min2 = inf
for unit in units:
umin1 = umin2 = inf
for x in unit:
if x < umin1:
umin2 = umin1
umin1 = x
elif x < umin2:
umin2 = x
ans += umin2
min2 = min(min2,umin2)
min1 = min(min1,umin1)
ans += min1 - min2
return ans
力扣506周赛-①维护两个哈希②贪心
http://blog.7a7a68.xyz/posts/506周赛/
作者
Waning
发布于
2026-06-14
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Waning
愿你明日如绚丽之花.
公告
还活着.
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
56
分类
8
标签
20
总字数
125,693
运行时长
0
最后活动
0 天前

目录