Leetcode第 275 场周赛
📒博客首页:*铁甲小宝同学*
🎅文章目的:周赛总结😻
🙏博主也在学习阶段,如若发现问题,请告知,非常感谢🙏
💗同时也非常感谢各位小伙伴们的支持💗
🌈每日一语:你只需要努力,其他的交给天意!!
第一题
检查是否每一行每一列都包含全部整数
本题为签到题。一般大家都可以做出来,还是建议大家多去尝试尝试周赛的!
思路:
由题的我们需要判断行和列是否都是从1 到 n的整数即可,我们首先可以把从1到n的所有数有序的放在一个数组中,然后再把矩阵里面的每行和每列的数都放在一个数组中,并排序之后在和最开始的那个进行判断,如果不相等返回flase即可。
代码:
class Solution: def checkValid(self, matrix: List[List[int]]) -> bool: line = list(range(1, len(matrix) + 1)) for x, y in zip(matrix, list(zip(*matrix))): if sorted(x) != line or sorted(y) != line: return False return True
第二题
最少交换次数来组合所有的 1 II
本题为正常难度的题,大家多刷题就可以做出来。
思路:
这个题主要难点就是他是一个循环数组,我们不仅仅需要判断正常的数组长度,还要考虑他的循环数组。
本题问的是需要最少的调换次数,我们可以不用固定的思维来一个个数需要调换几个次数。我们先获取每个数组里面所有1的长度,然后用这个长度当作滑块来对这个循环数组进行滑动,判断每个滑块里面的0的个数,找出最少的个数即可获得到最小交换次数。
在这里吐槽一下,这题对python不是很友好,python的速度确实很慢,我做了五次,优化了五次都是过不了,还是看大神的优化才过的。最后在吐槽一下,Python虽然语法简单,不足的地方就是速度太慢了。
代码:
我的最高优化:
class Solution: def minSwaps(self, nums: List[int]) -> int: hk = sum(nums) res = sum(nums[:hk]) a = res for i in range(0,len(nums)-hk+1): a = max(a,sum(nums[i:hk+i])) for i in range(0,hk): a = max(a,sum(nums[:i] + nums[i-hk:])) return hk -a
看了大神的优化:
class Solution: def minSwaps(self, nums: List[int]) -> int: n = len(nums) k = sum(nums) ans = float("inf") nums = nums*2 sums = sum(nums[:k]) ans = min(ans, k-sums) for i in range(k, n*2): if nums[i] == 1: sums += 1 if nums[i-k] == 1: sums -= 1 ans = min(ans, k-sums) return ans
第三题
统计追加字母可以获得的单词数
本题难度还可以,我看别的大神都是什么hash什么的做法,我属实没搞懂,就直接暴力了,还是太菜了!!!!!
思路:
本题所拼接或者重新排序看能得到目标数组里面的几个相同的单词,本题我就直接暴力了,还是建议大家能不暴力就不暴力,毕竟暴力没啥意思。
代码:
class Solution: def wordCount(self, startWords: List[str], targetWords: List[str]) -> int: a = set() for s in startWords: for c in 'abcdefghijklmnopqrstuvwxyz': if c not in s: a.add(''.join(sorted(s + c))) return sum(''.join(sorted(i)) in a for i in targetWords)