记录 22.9.25 第312场周赛1~3
LC周赛 四道题拿下两道 继续努力! 第三道差一点,第四道 并查集 看不懂,继续学习吧!努力奋斗。
6188. 按身高排序
题目链接:6188. 按身高排序
题目大意:给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。
对于每个下标 i,names[i] 和 heights[i] 表示第 i 个人的名字和身高。请按身高 降序 顺序返回对应的名字数组 names 。
例如:
输入:names = ["Mary","John","Emma"], heights = [180,165,170]
输出:["Mary","Emma","John"]
解释:Mary 最高,接着是 Emma 和 John 。
输入:names = ["Alice","Bob","Bob"], heights = [155,185,150]
输出:["Bob","Alice","Bob"]
解释:第一个 Bob 最高,然后是 Alice 和第二个 Bob 。
解题思路:
- 又只对了两道题 害! 还需努力啊
- 这次 看到了 全世界排名的答题,这次第一用的 py3 可以好好学习一下了!
class Solution:
def sortPeople(self, names: List[str], heights: List[int]) -> List[str]:
# 自己的代码
# 只想着取巧 使用函数 没成想忘了怎么用 真是。。。
"""
hash_map = {}
name_num = [i for i in range(len(names))]
for a,b in zip(name_num,heights):
hash_map[a]=b
c = sorted(hash_map.items(),key=lambda x:x[1],reverse=True)
return [names[i] for i,_ in c]
"""
# 全世界排名第一的大神的代码 真的简洁明了
l = [(j,i) for i,j in zip(names,heights)]
l.sort(reverse=True)
return [i[1] for i in l]
6189. 按位与最大的最长子数组
题目链接:6189. 按位与最大的最长子数组
题目大意:给你一个长度为 n 的整数数组 nums 。考虑 nums 中进行 按位与(bitwise AND)运算得到的值 最大 的 非空 子数组。
- 换句话说,令 k 是 nums 任意 子数组执行按位与运算所能得到的最大值。那么,只需要考虑那些执行一次按位与运算后等于 k 的子数组。
返回满足要求的 最长 子数组的长度。
数组的按位与就是对数组中的所有数字进行按位与运算。子数组 是数组中的一个连续元素序列。
例如:
输入:nums = [1,2,3,3,2,2]
输出:2
解释:
子数组按位与运算的最大值是 3 。
能得到此结果的最长子数组是 [3,3],所以返回 2 。
输入:nums = [1,2,3,4]
输出:1
解释:
子数组按位与运算的最大值是 4 。
能得到此结果的最长子数组是 [4],所以返回 1 。
解题思路:
- 这道题 读了好几遍 才搞明白 这是找最值啊!
- 害 这次代码写得还可以 很简洁明了。
class Solution:
def longestSubarray(self, nums: List[int]) -> int:
maxN = max(nums)
n = len(nums)
L,ans = 0,0
while L<n:
if nums[L] != maxN:
L += 1
continue
else:
R = L
while R<n and nums[R] == maxN:
R += 1
ans = max(ans,R-L)
L = R+1
return ans
6190. 找到所有好下标
题目链接:6190. 找到所有好下标
题目大意:给你一个大小为 n 下标从 0 开始的整数数组 nums 和一个正整数 k 。对于 k <= i < n - k 之间的一个下标 i ,如果它满足以下条件,我们就称它为一个 好 下标:
- 下标 i 之前 的 k 个元素是 非递增的 。
- 下标 i 之后 的 k 个元素是 非递减的 。
按 升序 返回所有好下标。
例如:
输入:nums = [2,1,1,1,3,4,1], k = 2
输出:[2,3]
解释:数组中有两个好下标:
- 下标 2 。子数组 [2,1] 是非递增的,子数组 [1,3] 是非递减的。
- 下标 3 。子数组 [1,1] 是非递增的,子数组 [3,4] 是非递减的。
注意,下标 4 不是好下标,因为 [4,1] 不是非递减的。
输入:nums = [2,1,1,2], k = 2
输出:[]
解释:数组中没有好下标。
解题思路:
- 这道题本来想 暴力 发现超时
- 我自己的处理方法是 方法(一)使用栈和牺牲空间 来处理
- 注意两个 if 条件非常的重要 是我牺牲了数次机会得到的测试用例 害!
- 方法(二) 是参考 本次排名世界第一的答题 真的太巧妙了 没想到啊!
- 总之这道题 需要牺牲空间换时间 一定要好好思考这道题 不要再次类型题上在浪费时间。
方法(一)
class Solution:
def goodIndices(self, nums: List[int], k: int) -> List[int]:
# 自己的方法
# AC了不知道 多少次 感觉给出的测试用例 纯纯地考验耐心!!!
# 开头的两个 if 非常重要
n = len(nums)
if k==1: return [i for i in range(k,n-k)]
if len(set(nums)) == 1: return [i for i in range(k,n-k)]
l1,l2 = list(),list()
stack = list()
ans = list()
for i in range(n):
if i>n-k: break
if len(stack)>=k:
l1.append(i)
if stack and stack[-1]<nums[i]:
stack = list()
stack.append(nums[i])
stack = list()
for i in range(n-1,-1,-1):
if i<k: break
if len(stack)>=k:
l2.append(i)
if stack and stack[-1]<nums[i]:
stack = list()
stack.append(nums[i])
# if len(l1)>len(l2): l1,l2 = l2,l1
for a in l1:
if a in l2:
ans.append(a)
return ans
方法(二)
class Solution:
def goodIndices(self, nums: List[int], k: int) -> List[int]:
n = len(nums)
if k==1: return [i for i in range(k,n-k)]
if len(set(nums)) == 1: return [i for i in range(k,n-k)]
bef,after = [1]*n,[1]*n
for i in range(1,n):
if nums[i] <= nums[i-1]:
bef[i] = bef[i-1]+1
for i in range(n-2,-1,-1):
if nums[i] <= nums[i+1]:
after[i] = after[i+1]+1
ans = list()
for i in range(k,n-k):
if bef[i-1] >= k and after[i+1] >= k:
ans.append(i)
return ans
总结
继续学习,还有好多不会的,抓紧时间。