今天想学习前缀和,然后把昨天的拓扑排序学习了。
但是呢? 我们先惯例打开每日一题,看看难不难哈哈哈哈
然后呢,真的是无比简单的一题啊,那就让我们来练手吧
文章目录
每日一题:1137. 第 N 个泰波那契数
https://leetcode-cn.com/problems/n-th-tribonacci-number/
题目描述
泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
给你整数 n,请返回第 n 个泰波那契数 Tn 的值。
示例 1:
输入:n = 4
输出:4
解释:
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4
示例 2:
输入:n = 25
输出:1389537
提示:
0 <= n <= 37
答案保证是一个 32 位整数,即 answer <= 2^31 - 1。
思路分析
非常非常典型的动态规划题,
时间复杂度:O(n)
空间复杂度:如果用滑动数组的话,O(1)
需要注意边界处理: 0,1,2 的赋值
用时: 21:28 - 21:31
class Solution:
def tribonacci(self, n: int) -> int:
if n == 0:return 0
if n==1 or n == 2: return 1
pre_list = [0,1,1]
for i in range(3,n+1):
pre_list = pre_list[1:] + [sum(pre_list)]
return pre_list[-1]
真的就so easy。
那么接下来我们就开始干活吧,虽然很晚了,但是我还是挺想吃板栗的,但是要忍住呀!
– 21:50的时候还是没忍住,吃了一袋。。
怎么说呢,经过我最近的反思,特别是从 课程表2 那题痛的领悟,我发现了,还是要先背模版再做题目,效率贼高,增益也大。所以我们先来看看前缀和的定义,以及它的模版是个什么玩意儿~
前缀和:
假设我们有一个字符串ABCDE,什么是这个单词的前缀,A、AB、ABC、ABCD、ABCDE就是这个单词的前缀,就是从第一个字母开始,依次往后拼接。E、ED、EDC、EDCB、EDCBA被称为这个单词的后缀。
前缀和大致分为两类,一维前缀和、二维前缀和。
适用场景:
一维前缀和的最主要目的就是求子数组的和的大小.
例如元素a[1]到a[3]的和。
a[1] + a[2] + a[3] = sum[3] - sum[0]
预处理数组的前缀和,可以达到 O ( 1 ) O(1) O(1)时间得到区间和
模版
一维前缀和
数组nums :
1- 定义一个数组s:长度为 len(nums)+1, 其中s[i]代表:前i个元素的和
2- 初始化 s[0] = 0, 原始元素的下标从1开始。
3-求l 到r 区间和: 前r个元素的和减去前l-1个元素的和即: s[r] - s[l-1]
二维前缀和
学习了模版之后,我们现在就是勇敢牛牛啦,冲呀!
一维前缀和例题:1365. 有多少小于当前数字的数字
https://leetcode-cn.com/problems/how-many-numbers-are-smaller-than-the-current-number/
题目描述:
给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。
换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。
以数组形式返回答案。
示例 1:
输入:nums = [8,1,2,2,3]
输出:[4,0,1,1,3]
解释:
对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。
对于 nums[1]=1 不存在比它小的数字。
对于 nums[2]=2 存在一个比它小的数字