Leetcode周赛_200学习笔记(PayPal)

学习来源:

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值