Leetcode_2020_秋季编程大赛

学习来源:

评论区大佬的题解


9.13学习:

LCP 17 速算机器人

算法分析:朴素法、数学法。
数学法:不管进行A操作还是B操作,最后的X+Y一定等于2*(X+Y)

return 2**(len(s))  #这里是2的len(s)次幂
LCP 18 早餐组合

分析顺序不涉及算法的优劣性
算法分析1:朴素算法容易超时,若不采用二分查找,则需要考虑简化双层遍历(双指针)。首先排序后的数组默认由小到大,因此从staple中取出的元素值只会越来越大。那么相对应的,留给drinks的目标值只会越来越小。因此指向drinks的指针只需从尾部向头部移动,不需要每次都初始化为尾部。

staple.sort()
drinks.sort()
mod = 1000000007
r = len(drinks) - 1
res = 0
for i in range(len(staple)):
	'''
	若当前i=前一个i,则while的条件无法满足,直接更新res
	若当前i>前一个i,则while条件有可能满足,若满足,则r继续向drinks头部移动
	'''
    while r >= 0 and drinks[r] + staple[i] > x:
        r -= 1
    res = (res + r + 1)
return res % mod

算法分析2二分查找,遍历staples,在drinks中二分查找。

def binarysearch(a,x):
	l = 0
	 r = len(a)
	 while l<r:
	     m = l + (r - l)//2
	     if a[m] > x:
	         r = m
	     else:
	         l = m + 1
	 return l
staple.sort()
drinks.sort()
mod = 1000000007
res = 0
for i in range(len(staple)):
	t = x - staple[i]
	ind = binarysearch(drinks, t)
	if ind == 0:
		break
	res = (res + ind) % mod
return res

算法分析3:空间换时间,arr[i]表示在staple中,当有i元时,可以选择的主食有多少种。

res = 0
mod = 1000000007
arr = [0 for _ in range(x+1)]
for i in staple:
    if i < x:
        arr[i] += 1
for i in range(2,x+1):
    arr[i] += arr[i-1]
for i in drinks:
    remian = x - i
    if remian > 0:
        res += arr[remian]
return res % mod

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值