数列的基础知识
基本概念
在程序中数列对应到数组了。程序中的数组,唯一需要注意的是数组角标越界的问题吧,C和C++在发生数组角标越界的时候,编译是可以正常过的,但是运行结果就可能十分的奇怪了。
① 等差数列
等差数列这里需要注意的是在求公差上会和欧几里得算法联系起来。
举例——等差数列
② 等比数列
③ 斐波那契数列
斐波那契数列是递归、递推、动态规划都可以用它作为演示的,太绝绝子了。
现学现用
第一题 509. 斐波那契数
题目描述
解题报告
第一想法是使用递推来解决这个问题,此时其实是有浅浅的动态规划的味道了,
即当前的这个状态i是只能由第i-1个状态和第i-2个状态共同转移过来。动态规划的本质也就是递推吧,我现在的理解是这种的。
因为本题只需要最后的结果,那么也就是说只需要当前i的前一个状态i-1的数值以及前两个状态i-2的数值。那么其间的结果,其实不必存起来的,这种可以优化一定的空间。
参考代码(C/C++版本)
C语言版本,C++用这个代码也是没有问题的
优化空间版本
C++用这个代码也是没有问题的,就不额外再放C++的代码了
第二题 1137. 第 N 个泰波那契数
题目描述
解题报告
妥妥的变型题了,解题报告就不详细写啦~
参考代码(C/C++版本)
C和C++都可以用
第三题 剑指 Offer 64. 求1+2+…+n
用逻辑与(&&)进行判断+浅认识sizeof
题目描述
解题报告
它不让咱们用这些,但是我偏要用,也是可以的,不影响Ac,但是咱们不能不讲码德,显得欺负这个老同志
不用乘除法是为了让咱们直接使用等差数列求和公式,循环这儿是遏制了迭代嘛。
可能已经有小伙伴想到使用递归来求解了,但是注意嗷,递归是需要判断递归的边界,进行判断或多或少需要使用if或者三元运算符,但是它们也被遏制了。
因为这个题是从1开始计数的,那么就可以使用逻辑与结合递归来实现。
每次进入递归之前判断当前进行递归的数是否是0了,倘若到0了,就终止,否则继续递归。
n += sunNums(n-1)这儿就是在具体的落实递归的逻辑了,也不用想的特别打脑壳的亚子。
比如首次传递的参数是n = 3,n += sunNums(n-1)这儿就是3 += 传入的参数是2的情况;
对于参数是2的,也是一样的逻辑,去加上传入参数是1的情况,也就可以得到2+1(因为0那儿进不去了)。
这个2+1是sunNums(n-1)的结果了,3+2+1最后得到的,就是最终答案了
参考代码(C/C++版本)
这个代码C和C++都可以用
发现大佬们玩的是内存,比较秀,浅记录一下
等差数列的求和是可以这种描述的
为了能够让空间和咱们模拟的数字对应,使用布尔类型来存储,因为1个布尔变量是一字节,那么在这个梯形矩阵中就可以和模拟的数字对应上了。至于丈量空间的大小,就可以使用sizeof了。
第四题 896. 单调数列
枚举的时候,注意数组角标越界问题
题目描述
解题报告
这个是常规的模拟,就不写解题报告了吧
参考代码(C/C++版本)
C++的代码
第五题 1313. 解压缩编码列表
题目描述
解题报告
确实是常规的模拟,C++这么感觉没有什么特殊的,倒是在C语言这儿,要赋值一个数组长度,感觉有点幺蛾子呀
参考代码(C/C++版本)
C语言版本
C++版本
第六题 剑指 Offer 57 - II. 和为s的连续正数序列
用双指针实现滑动窗口
题目描述
解题报告
滑动窗口其实可以通过名字意会出来吧~
设连续正整数序列的左边界 left 和右边界right ,则可构建滑动窗口从左向右滑动。循环中,每轮判断滑动窗口内元素和与目标值 target 的大小关系,若相等则记录结果,若大于 target 则移动左边界 left (以减小窗口内的元素和),若小于target 则移动右边界right (以增大窗口内的元素和)。
算法实现流程
① 初始化: 左边界left = 1,右边界right = 2,总和sum = 1+2
② 进入双指针迭代的循环
当left > right时跳出循环。
——若sum > target,将left 剔除,更新总和sum,left++
——若sum < target,right++,将right增加,更新总和sum
——若sum == target,对于本题,记录当前的结果,向右移动左边界
浅借一下K神的图…
参考代码(C/C++版本)
C版本
C++版本
第七题 829. 连续整数求和
题目描述
解题报告
这个题挂的是困难的标签,但是我可能没有get到相应的点,用常规的模拟解决出来了。
因为题目要求咱找到连续的,且总和为n的情况,那咱们从小到大的去枚举,枚举到符合条件,也就是(参数n-总和sum)%枚举的个数cnt == 0的时候,就可以进行统计了。
参考代码(C/C++版本)
C语言版本
C++版本