想要去欺负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


相关文章
|
6天前
|
算法
【数组相关面试题】LeetCode试题
【数组相关面试题】LeetCode试题
|
6天前
|
存储
力扣面试经典题之数组/字符串
力扣面试经典题之数组/字符串
27 0
|
6天前
|
人工智能 BI
力扣561 数组拆分
力扣561 数组拆分
|
6天前
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
|
6天前
|
算法
leetcode代码记录(寻找两个正序数组的中位数
leetcode代码记录(寻找两个正序数组的中位数
13 2
|
6天前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
13 0
|
6天前
leetcode代码记录(两个数组的交集
leetcode代码记录(两个数组的交集
9 1
|
6天前
leetcode代码记录(最大子数组和
leetcode代码记录(最大子数组和
12 2
|
6天前
|
存储 算法
Leetcode 30天高效刷数据结构和算法 Day1 两数之和 —— 无序数组
给定一个无序整数数组和目标值,找出数组中和为目标值的两个数的下标。要求不重复且可按任意顺序返回。示例:输入nums = [2,7,11,15], target = 9,输出[0,1]。暴力解法时间复杂度O(n²),优化解法利用哈希表实现,时间复杂度O(n)。
22 0
|
6天前
|
索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引