想要去欺负Leetcode的这些年——第二次,看看咱们是怎么把数组玩转,把数列理解透彻的~

简介: 想要去欺负Leetcode的这些年——第二次,看看咱们是怎么把数组玩转,把数列理解透彻的~

数列的基础知识


基本概念

微信图片_20221019181504.png

在程序中数列对应到数组了。程序中的数组,唯一需要注意的是数组角标越界的问题吧,C和C++在发生数组角标越界的时候,编译是可以正常过的,但是运行结果就可能十分的奇怪了。

微信图片_20221019181539.png

① 等差数列

微信图片_20221019181618.png

等差数列这里需要注意的是在求公差上会和欧几里得算法联系起来。

举例——等差数列


② 等比数列

微信图片_20221019181723.png

③ 斐波那契数列


斐波那契数列是递归、递推、动态规划都可以用它作为演示的,太绝绝子了。

微信图片_20221019181752.png

现学现用


第一题 509. 斐波那契数


题目描述

微信图片_20221019181846.png

解题报告


第一想法是使用递推来解决这个问题,此时其实是有浅浅的动态规划的味道了,

即当前的这个状态i是只能由第i-1个状态和第i-2个状态共同转移过来。动态规划的本质也就是递推吧,我现在的理解是这种的。


因为本题只需要最后的结果,那么也就是说只需要当前i的前一个状态i-1的数值以及前两个状态i-2的数值。那么其间的结果,其实不必存起来的,这种可以优化一定的空间。


参考代码(C/C++版本)


C语言版本,C++用这个代码也是没有问题的

微信图片_20221019181938.png

优化空间版本

C++用这个代码也是没有问题的,就不额外再放C++的代码了

微信图片_20221019182010.png


第二题 1137. 第 N 个泰波那契数


题目描述微信图片_20221019182048.png

解题报告


妥妥的变型题了,解题报告就不详细写啦~


参考代码(C/C++版本)


C和C++都可以用

微信图片_20221019182331.png

第三题 剑指 Offer 64. 求1+2+…+n


用逻辑与(&&)进行判断+浅认识sizeof


题目描述

微信图片_20221019182415.png

解题报告


它不让咱们用这些,但是我偏要用,也是可以的,不影响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++都可以用

微信图片_20221019182518.jpg

发现大佬们玩的是内存,比较秀,浅记录一下

微信图片_20221019182546.jpg

等差数列的求和是可以这种描述的

微信图片_20221019182614.jpg

 

为了能够让空间和咱们模拟的数字对应,使用布尔类型来存储,因为1个布尔变量是一字节,那么在这个梯形矩阵中就可以和模拟的数字对应上了。至于丈量空间的大小,就可以使用sizeof了。

微信图片_20221019182631.jpg

第四题 896. 单调数列


枚举的时候,注意数组角标越界问题


题目描述

微信图片_20221019182714.png

解题报告


这个是常规的模拟,就不写解题报告了吧


参考代码(C/C++版本)

微信图片_20221019182856.png

C++的代码

微信图片_20221019182952.png

第五题 1313. 解压缩编码列表


题目描述

微信图片_20221019183210.png

解题报告


确实是常规的模拟,C++这么感觉没有什么特殊的,倒是在C语言这儿,要赋值一个数组长度,感觉有点幺蛾子呀


参考代码(C/C++版本)


C语言版本

微信图片_20221019183313.png

C++版本微信图片_20221019183340.png


第六题 剑指 Offer 57 - II. 和为s的连续正数序列


用双指针实现滑动窗口


题目描述

微信图片_20221019183424.png

解题报告


滑动窗口其实可以通过名字意会出来吧~

设连续正整数序列的左边界 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,对于本题,记录当前的结果,向右移动左边界

微信图片_20221019183652.jpg

 

浅借一下K神的图…


参考代码(C/C++版本)


C版本

微信图片_20221019183749.jpg

 

C++版本微信图片_20221019183859.jpg

第七题 829. 连续整数求和


题目描述

微信图片_20221019184020.png

解题报告


这个题挂的是困难的标签,但是我可能没有get到相应的点,用常规的模拟解决出来了。

因为题目要求咱找到连续的,且总和为n的情况,那咱们从小到大的去枚举,枚举到符合条件,也就是(参数n-总和sum)%枚举的个数cnt == 0的时候,就可以进行统计了。


参考代码(C/C++版本)


C语言版本

微信图片_20221019184134.jpg

C++版本微信图片_20221019184211.jpg


相关文章
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
43 0
|
4月前
|
算法
LeetCode第53题最大子数组和
LeetCode第53题"最大子数组和"的解题方法,利用动态规划思想,通过一次遍历数组,维护到当前元素为止的最大子数组和,有效避免了复杂度更高的暴力解法。
LeetCode第53题最大子数组和
|
4月前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
125 2
LeetCode------找到所有数组中消失的数字(6)【数组】
这篇文章介绍了LeetCode上的"找到所有数组中消失的数字"问题,提供了一种解法,通过两次遍历来找出所有未在数组中出现的数字:第一次遍历将数组中的每个数字对应位置的值增加数组长度,第二次遍历找出所有未被增加的数字,即缺失的数字。
|
4月前
|
前端开发
LeetCode------移动零(5)【数组】
这篇文章介绍了LeetCode上的"移动零"问题,提出了一种使用双指针的原地操作解法,该方法首先将非零元素移动到数组前端并保持相对顺序,然后填充后续位置为零,以达到题目要求。
|
2月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
24 4
|
2月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
24 0
Leetcode第三十三题(搜索旋转排序数组)
|
2月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
70 0
|
2月前
Leetcode第38题(外观数列)
LeetCode第38题要求生成外观数列的第n项,该数列从数字1开始,每一项都是对前一项的描述,例如第1项是"1",第2项是"11",第3项是"21",以此类推。
34 0