[Leetcode/Python3] 第204场周赛题解
P1 重复至少 K 次且长度为 M 的模式
给你一个正整数数组 arr,请你找出一个长度为 m 且在数组中至少重复 k 次的模式。
模式 是由一个或多个值组成的子数组(连续的子序列),连续 重复多次但 不重叠 。 模式由其长度和重复次数定义。
如果数组中存在至少重复 k 次且长度为 m 的模式,则返回 true ,否则返回 false 。
解:
- 数组不支持hash,转化为字符串就好了
class Solution:def containsPattern(self, arr: List[int], m: int, K: int) -> bool:def hashcode(A):return ",".join(map(str, A))n = len(arr)s = hashcode(arr)for i in range(n):j = i + mif j > n:breakif hashcode(arr[i:j] * K) in s: return Truereturn False
P2 乘积为正数的最长子数组长度
给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。
一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。
请你返回乘积为正数的最长子数组长度。
解:
- 数一数,遇到0重置。
class Solution:def getMaxLen(self, nums: List[int]) -> int:if not nums: return 0 def sign(x):if x > 0: return 1if x == 0 : return 0return -1n = len(nums)pos, neg, acc = -1, n, 1ret = 0for i, x in enumerate(nums):acc *= sign(x)if acc == 0:pos, neg, acc = i, n, 1elif acc < 0:if neg == n:neg = ielse: ret = max(ret, i - neg)else: ret = max(ret, i-pos)return ret
P3 使陆地分离的最少天数
给你一个由若干 0 和 1 组成的二维网格 grid ,其中 0 表示水,而 1 表示陆地。岛屿由水平方向或竖直方向上相邻的 1 (陆地)连接形成。
如果 恰好只有一座岛屿 ,则认为陆地是 连通的 ;否则,陆地就是 分离的 。
一天内,可以将任何单个陆地单元(1)更改为水单元(0)。
返回使陆地分离的最少天数。
解:
- 分析, 最多2次。对左上角的点, 移掉右边和下边的点,它就一定是分离的。
- 判断是否是0次,1次。
- 判断是否1次可以用Tarjan算法, Tarjan算法,还不会写,会了之后,再总结一下。
class DSU:def __init__(self, N):self.parent = [x for x in range(N)]def find(self, x):if self.parent[x] == x:return xelse:# path compressionret = self.find(self.parent[x])self.parent[x] = retreturn retdef union(self, x, y):# px == self.parent[px]px = self.find(x)py = self.find(y)self.parent[px] = self.parent[py]class Solution:def minDays(self, grid: List[List[int]]) -> int:if not self.isconnect(grid): return 0n, m = len(grid), len(grid[0])for i in range(n):for j in range(m):if grid[i][j] == 1:grid[i][j] = 0if not self.isconnect(grid):return 1grid[i][j] = 1return 2 def isconnect(self, grid: List[List[int]]) -> bool:n, m = len(grid), len(grid[0])N = n*mdsu = DSU(N)def idx(i, j): return i*m + jfor i in range(n):for j in range(m):if grid[i][j] == 0: continuefor dx, dy in [[1,0],[-1,0],[0,1],[0,-1]]:ni, nj = i+dx, j + dyif 0 <= ni < n and 0 <= nj <m and grid[ni][nj] == 1:dsu.union(idx(i,j), idx(ni, nj))parent = set() for i in range(n):for j in range(m):if grid[i][j] == 1:parent.add(dsu.find(idx(i, j)))return len(parent) == 1
P4 将子数组重新排序得到同一个二叉查找树的方案数
给你一个数组 nums 表示 1 到 n 的一个排列。我们按照元素在 nums 中的顺序依次插入一个初始为空的二叉查找树(BST)。请你统计将 nums 重新排序后,统计满足如下条件的方案数:重排后得到的二叉查找树与 nums 原本数字顺序得到的二叉查找树相同。
比方说,给你 nums = [2,1,3],我们得到一棵 2 为根,1 为左孩子,3 为右孩子的树。数组 [2,3,1] 也能得到相同的 BST,但 [3,2,1] 会得到一棵不同的 BST 。
请你返回重排 nums 后,与原数组 nums 得到相同二叉查找树的方案数。
由于答案可能会很大,请将结果对 10^9 + 7 取余数。
解:
- 模拟快排过程, pivot选第一个数。
- 计算的话, 就是用到组合数 C n k C_n^k Cnk。阶乘运算会重复很多次,开个表记录一下。 这样算的就比较快了(不知道不开表会不会TLE)。
class Solution:def numOfWays(self, nums: List[int]) -> int:n = len(nums)mod = 10 **9 + 7self.T = [1]*(n + 1)for i in range(1, n + 1):self.T[i] = self.T[i-1] *ireturn (self.F(nums) - 1) % moddef C(self, n, k):return self.T[n] // self.T[n-k] // self.T[k]def F(self, nums: List[int]) -> int:if not nums or len(nums) == 1: return 1pivot = nums[0]A, B = [], []for x in nums[1:]:if x > pivot: A.append(x)if x < pivot: B.append(x)n, m = len(A), len(B) return self.C(n+m, m) * self.F(A) * self.F(B)
[Leetcode/Python3] 第204场周赛题解相关推荐
- LeetCode第 227 场周赛题解
LeetCode第 227 场周赛题解 检查数组是否经排序和轮转得到 原题链接 https://leetcode-cn.com/problems/check-if-array-is-sorted-an ...
- 20201015:力扣第210场周赛题解(上)
力扣第210场周赛题解上 题目 思路与算法 代码实现 写在最后 题目 括号的最大嵌套深度 最大网络秩 思路与算法 第一题典型的栈数据结构求最大栈长的题目 第二题是一个经典的出入度题目,本题更加简单,统 ...
- (补)20200911:力扣204周周赛题解下
力扣204周周赛题解下 题目 思路与算法 代码实现 写在最后 题目 3.1568. 使陆地分离的最少天数 思路与算法 本周周赛第三题勉强可以看看,第四题超出我目前的水平,跳过.第三题是一个典型的dfs ...
- 20200910:力扣204周周赛题解上(Java/Python/Cpp)
力扣204周周赛题解上 题目 思路与算法 代码实现 写在最后 题目 1.1566. 重复至少 K 次且长度为 M 的模式 2.1567. 乘积为正数的最长子数组长度 思路与算法 热身题不要求算法技巧, ...
- Leetcode之第294场周赛小记
小记 本篇博客记录小黑第三次参加leetcode周赛(294场次)的成绩,以及对题目的总结,以便鞭策自己不断前进 . 这次周赛是我第三次参加,前两题比较简单,做起来也是非常顺利,只用了15分钟就完成解 ...
- 【Leetcode】第 278 场周赛
前言 第 278 场周赛是Leetcode上2021年最后一场周赛,也是我第一次参加的周赛,第一道题秒了,然后可能是自己肚子疼吧,第二题写完一直有bug,死活找不出来,一直被卡住.直到比赛结束后,吃完 ...
- Leetcode之第297场周赛小记
小记 本篇博客记录小黑第六次参加leetcode周赛(297场次)的成绩,以及对题目的总结,以便鞭策自己不断前进 . 下面主要是对题目进行分析总结,也是为之后面试做准备. 题目一:2303. 计算应缴 ...
- 20201221:力扣220场周赛题解
力扣220场周赛 题目 思路与算法 代码实现 写在最后 题目 重新格式化电话号码 删除子数组的最大得分 跳跃游戏 VI 思路与算法 简单的string操作,用cpp或者java均可. 使用一个map来 ...
- 【JAVA】LeetCode力扣 第199场周赛 题解+代码
目录 一.5472. 重新排列字符串 Easy 方法:暴力 二.5473. 灯泡开关 IV Medium 方法:从左往右,只要和flag不一致,就翻转 三.5474. 好叶子节点对的数量 Medium ...
最新文章
- RDKit | 基于分子形状的比对
- h5列表页的性能优化
- visio保存后公式变形_涨姿势了!仿真变形后的模型还能保存下来
- Python:知识目录
- android audio 音量设置分析
- IOS开发之支付功能概述
- Swift - 29 - 参数的默认值
- 【BZOJ】【2768】【JLOI2010】冠军调查
- RTMP直播推流Video(视频)
- [Sensor]BMI160-加速度计、陀螺仪传感器
- pdf文件的预览——几种方式实现——技能提升
- 英语学术论文简短语句摘抄
- 总体分布概况符合无界约翰逊分布(johnsonsu)的情况
- 计算机启动后只有鼠标桌面黑屏,电脑开机黑屏只有鼠标的解决方法
- 停止无效学习,4种高效学习方法,快速提升自己
- 英文会议论文出版地信息汇总
- 【计算机程序设计基础】数据结构概论
- 区块链溯源的应用四大领域
- 大学计算机系三年论文6000字,计算机论文6000字范文_计算机论文_计算机应用论文...
- 算法第四题:学生出勤记录情况统计 2021-08-19