题目看起来都会,一交就错
5613. 最富有客户的资产总量(3分,通过率:2900/3025)
给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。
客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。
class Solution:
def maximumWealth(self, accounts: List[List[int]]) -> int:
return max([sum(i) for i in accounts])
5614. 找出最具竞争力的子序列(4分,通过率:1085/7016)
和我之前写的一篇题解思路一样
【11月打卡~Leetcode每日一题】402. 移掉K位数字(难度:中等)
但是题目中不是去除k个数字,而是保留k个数字,没看清题,交错了几次
class Solution:
def mostCompetitive(self, nums: List[int], k: int) -> List[int]:
pile = 0
k = len(nums)-k
while(k and pile<len(nums)-1):
if nums[pile]>nums[pile+1]:
nums.remove(nums[pile])
k -= 1
pile = 0 if pile==0 else pile-1
else:
pile += 1
if not k:
return nums
else:
return nums[:-k]
5615. 使数组互补的最少操作次数(6分,通过率:173/2059)
给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit 。每一次操作,你可以将 nums 中的任何整数替换为 1 到 limit 之间的另一个整数。
如果对于所有下标 i(下标从 0 开始),nums[i] + nums[n - 1 - i] 都等于同一个数,则数组 nums 是 互补的 。例如,数组 [1,2,3,4] 是互补的,因为对于所有下标 i ,nums[i] + nums[n - 1 - i] = 5 。
返回使数组 互补 的 最少 操作次数。
我的思路是用桶存储每两个互补队间可以更改到的区间,以及对应需要更改的次数,最后返回visited中的最小值即可
class Solution:
def minMoves(self, nums: List[int], limit: int) -> int:
count = collections.defaultdict(lambda:0)
visited = set()
for i in range(1+nums[0],limit+nums[0]+1):
visited.add(i)
for j in range(1+nums[-1],limit+nums[-1]+1):
visited.add(j)
for i in visited:
count[i] += 1
count[nums[0]+nums[-1]] -= 1
for i in range(1,len(nums)>>1):
for num in visited.copy():
if num not in range(1+nums[i],1+nums[i]+limit):
if num not in range(1+nums[-i-1],1+nums[-i-1]+limit):
visited.remove(num)
for num in visited:
count[num] += 1
count[nums[i]+nums[-i-1]] -= 1
ans = float("inf")
for num in visited:
ans = min(ans,count[num])
return ans
时间复杂度在最坏的情况下为O(limit*N),其中N为数组长度,我本以为以及够了,但是实测仍会超时。
因此只能考虑O(limit+N)或者O(N)的算法了,但是我想了半天没想到…