学习来源:
leetcode官方题解
评论区大佬的题解
5475
暴力枚举法:可以在进行第三层循环前添加判断条件,降低一定的时间消耗
5476
算法思想:记录当前数值获胜的次数,若当前获胜值更新,则重置获胜次数。
tips:
能直接修改数组就不要申请新的空间进行复制,否则及其容易超时。
def getWinner(self, arr: List[int], k: int) -> int:
count = 0
maxnum = max(arr)
win = arr[0]
while count < k:
if arr[0]<arr[1]:
win = arr[1]
count = 1
arr.append(arr[0])
del arr[0]
else:
count += 1
arr.append(arr[1])
del arr[1]
if win == maxnum:
return win
# print(new)
return win
双指针方法:cur_win表示当前胜者,count表示胜利次数。当数组很大的时候,对数组的修改将面临很大的时间开销,因此可以通过索引进行解题。
def getWinner(self, arr: List[int], k: int) -> int:
cur_win, count = arr[0], 0
for i in range(1,len(arr)):
if arr[i] < cur_win:
count += 1
else:
cur_win = arr[i]
count = 1
if count == k:
return cur_win
return cur_win
5477
算法思想:贪心算法,对每行从右向左统计0
的个数,外循环从第一行遍历至最后一行,内循环从当前遍历行开始,向下寻找第一个满足条件的行,累加替换次数即可。
def minSwaps(self, grid: List[List[int]]) -> int:
n = len(grid)
zerolist = []
for i in range(n):
count = 0
for j in range(n-1,-1,-1):
if grid[i][j] == 0:
count += 1
else:
break
zerolist.append(count)
res = 0
for i in range(n):
target = n-1-i
ind = i
for j in range(i,n):
if zerolist[j] >= target:
ind = j
break
if j == n-1:
return -1
res += (ind-i)
for k in range(ind,i,-1):
zerolist[k],zerolist[k-1] = zerolist[k-1], zerolist[k]
return res
5478
双指针遍历,记录相同数值的索引,两个数组的相同数值之间数值,累加取较大值即可。
tips
:理解题意才能理出思路,多看样例。
def maxSum(self, nums1: List[int], nums2: List[int]) -> int:
point1 = point2 = 0
lens1 = len(nums1)
lens2 = len(nums2)
same_point1 = same_point2 = -1
res = 0
tr1 = 0
tr2 = 0
while point1 < lens1 and point2 < lens2:
if nums1[point1] == nums2[point2]:
res += max(tr1,tr2)
res += nums1[point1]
tr1 = tr2 = 0
same_point1 = point1
same_point2 = point2
point1 += 1
point2 += 1
elif nums1[point1] > nums2[point2]:
tr2 += nums2[point2]
point2 += 1
else:
tr1 += nums1[point1]
point1 += 1
res += max(sum(nums1[same_point1+1:]),sum(nums2[same_point2+1:]))
return res%(1000000007)