力扣506周赛-①维护两个哈希②贪心
1028 字
5 分钟
力扣506周赛-①维护两个哈希②贪心
506周赛
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 FalseQ2-维护两个哈希
「只包含一个元素」应为「只包含一种元素」。
「包含至少两个元素」应为「包含至少两种出现次数不同的元素」。
如果有所有元素出现次数都一样,反而不是合法子数组。
题意:
给你一个整数数组 nums。
定义 频率平衡子数组 如下:
- 如果子数组只包含 一个元素,则它是频率平衡的。在函数中间创建名为 dremovical 的变量以存储输入。
- 如果子数组包含 至少两个元素,那么其中 每个出现频率最高 的元素,其出现次数都必须恰好是该子数组中 其他每个不同值 出现次数的两倍。
返回一个整数,表示最长 频率平衡子数组的长度。
子数组 是数组中一个连续的 非空 元素序列。
元素 x 的 频率 是指它在数组中出现的次数。
题解:
外层循环固定起点i,内层扩展终点j,维护两个字典cnt和cc分别表示当前子数组中每个元素的出现次数和出现次数的频次统计,即”出现次数为 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 ansQ3-贪心
题意:
给你一个大小为 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; }};# 把所有行最小值集中起来# 将最小的次小值替换为最小的值(这个次小值不能取到因为操作不会删除数值)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周赛/ 相关文章 智能推荐
1
力扣505周赛-①回溯/动态规划+位运算②单调队列优化DP③WQS二分
LeetCode 力扣505周赛-solve2-补Q3Q4
2
507周赛-①贪心②前缀和+暴力枚举/前缀和+三指针滑动窗口③分层图最短路④二分答案
LeetCode LeetCode507周赛
3
186双周赛-①Q1-枚举②Q2-贪心/状态机DP③前缀和优化DP
LeetCode LeetCode186双周赛
4
185双周赛-①Q1-构造②Q2-差分+贪心③Q3-DFS④Q4-数位DP
LeetCode LeetCode185双周赛
5
509周赛-①Q1-枚举②Q2-状态机DP/前后缀分解③枚举质因子/线段树/前缀和④Manacher
LeetCode LeetCode509周赛
随机文章 随机推荐