LC周赛 四道题拿下两道 继续努力! 第三道差一点,第四道 并查集 看不懂,继续学习吧!努力奋斗。
题目链接: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 。
解题思路:
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. 按位与最大的最长子数组
题目大意:给你一个长度为 n 的整数数组 nums 。考虑 nums 中进行 按位与(bitwise AND)运算得到的值 最大 的 非空 子数组。
例如:
输入: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. 找到所有好下标
题目大意:给你一个大小为 n 下标从 0 开始的整数数组 nums 和一个正整数 k 。对于 k <= i < n - k 之间的一个下标 i ,如果它满足以下条件,我们就称它为一个 好 下标:
例如:
输入: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
输出:[]
解释:数组中没有好下标。
解题思路:
方法(一)
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
继续学习,还有好多不会的,抓紧时间。