视频解说:数据结构和算法入门20例 (源码+详解)
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了视频解说:数据结构和算法入门20例 (源码+详解)相关的知识,希望对你有一定的参考价值。
前言
很多人加我都是想询问如何学好算法。我的方法是我用了 十年 的时间,自己总结出来的,不可能适合所有人,但是我觉得挺有效的,如果你觉得可行,尽管一试!
首先,我们心中要有一团🔥火🔥,一团希望之🔥火🔥!只要你心中充满希望,即使是死去的意志也会在你内心复活。
你永远无法弥补你的过去,但是,你可以改变你的未来!就算暗淡无光的尘土,也会有爆发光芒的那一刻!抓住那尘埃中的刹那光辉,燃烧自己吧!
点击我跳转末尾 获取 粉丝专属 《算法和数据结构》源码,以及获取博主的联系方式。
一、树立目标
给自己树立一个「 目标 」是非常重要的,有「 目标 」才会有「 方向 」,有「 目标 」才会有「 动力 」,有「 目标 」才会有「 人生的意义 」。有了「 目标 」,再做一定的「 规划 」,并且「 坚持 」做下去,我相信,「 成功的一天终会到来 」。
目标可以是:刷一万道题、学会一百个算法、拿到字节的 offer、年入百万 等等,因人而异,当然,不建议以 财务自由 作为目标,因为每个人对 财务自由 的定义不同。
二、如何开始
我不是很推崇从一开始就看 《算法导论》 这样的天书,没错,对于初学者而言,这就是天书。在对算法没有任何概念的情况,看书并不是一个明智的选择。
那么问题来了,不看书,我们看什么呢?
第一阶段我是这么规划的:
1)挑一门自己想学习的语言;
2)零基础情况下,把 50 个简单题先刷掉;
3)遇到不会的,先想10分钟,想不出来看「 解题报告 」;
4)看完后一定要自己敲一遍,并且放到重刷列表;
5)重新刷之前 50 个题里面你看了「 解题报告 」的题;
接下来才是本文的重点内容。
文章目录
三、找到组织
说了这么多,只是想建立一个「 愿景 」。这个「 愿景 」就是 —— 「 群人皆佬,共赴大厂 」。
光有「 愿景 」是不够的,我们需要「 付诸实际行动 」,任何一项大工程都不是「 一朝一夕 」能够完成的,「 制定计划 」 是尤为重要的事情。例如,想要学好算法,至少需要掌握一门语言,可以是 C、C++、Python、Java。这里强烈推荐 C语言,因为俗话说得好:
为了 「 督促大家 」更好的学习,所以我建立了一些团队供各位 「 技术交流 」之用,因为团队大了不好带,所以初期就把团队分好组,这样每个团队都能有很好的照顾,比一下子吃成胖子要好得多,当然每个团队我都会挑选一些 「 精英人员 」作为领袖,以便更好的来达成我们共同的 「 愿景 」。
这主要是提供给各位志想同道合之士交流沟通的一个桥梁,起到 「 媒介 」的作用。让同样和我 「 志同道合 」的人积极投身到这个事业中来,将祖国的 「 算法 」发扬光大,背靠祖国,面向国际,强我国威,壮我河山!
用 「 算法 」改变世界, 「 让天下没有难学的算法 」。
我不希望你是以粉丝的身份加入我的团队,我更希望我们是 「 合伙人 」,只是没有任何利益上的输送,我也不会在里面做任何产品的推销,所以, 「 广告商勿扰 」。
大多都是正在上大学的学生,我不想赚学生的钱,毕竟能上学已属不易。而且,很多大学生的激情, 「 引燃 」了我自己的 「 青春 」,所以我很喜欢和大学生交流,有时候也会给他们一些面试以及职场上的建议,久而久之,就成了 「 无话不谈 」的好朋友。
正是这一点,让我激发了认识更多的人的欲望,毕竟, 「 活到老学到老 」, 「 靠近优秀的人,使自己变得更加优秀 」,始终保持一个学习的态度,多沟通交流,让自己 「 更加强大 」!
各位成员是有明确共同目标的,这样才能共同成长,大致特征如下:
如果你满足以上任意一点,那么,我们就是志同道合的人啦!请通过 「 博主的CSDN主页 」 找到联系方式,联系博主。
四、零基础算法
1、求1+2+…+n
1. 问题描述
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
2. 问题分析
首先,题目要求不用乘法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。那如果我用了会怎么样?答案是并不会怎么样,因为平台不会去对它做语法分析,只是调用了你的函数,提供一些输入数据,如果输出数据和它给定的相同,就算通过。
作为你接触算法的第一道题,其实这些条件都无所谓的,能过就行,他只检测输入输出,不检测你实际代码。
对于新人来说,把问题过掉比问题本身更重要,题数的增加,是信心的增加,信心比什么都重要,有了信心,你才能继续往下走,只要你能往下推进,你才能继续学习,继续学习你迟早会学到相应的算法。好了,过了这题以后,把这道题放入你的重刷列表,等你对算法有一定理解以后再来用题目要求的方法来过了它。
3. 源码详解
int sumNums(int n){
return n * (n+1) / 2; // (1)
}
( 1 ) (1) (1) 公差为 1 的等差数列求和公式,完事;
2、递归乘法
1. 问题描述
递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。
2. 问题分析
第一题做的时候,我说过什么来着?别想太多,记住,你还是小白的时候,千万不要想太多,绕过平台规则自由的飞翔,让你的进度往前推进,有信心以后再回来巩固和提高。
3. 源码详解
int multiply(int A, int B){
return A * B; // (1)
}
- ( 1 ) (1) (1) 管他什么递归乘法,直接上乘法运算符;
3、斐波那契数
1. 问题描述
斐波那契数,通常用 F ( n ) F(n) F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 0 0 和 1 1 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F ( 0 ) = 0 , F ( 1 ) = 1 F ( n ) = F ( n − 1 ) + F ( n − 2 ) , ( 1 < n ≤ 30 ) F(0) = 0,F(1) = 1 \\\\ F(n) = F(n - 1) + F(n - 2), (1 \\lt n \\le 30) F(0)=0,F(1)=1F(n)=F(n−1)+F(n−2),(1<n≤30) 给你 n n n ,请计算 F ( n ) F(n) F(n)。
2. 问题分析
这个问题考察的是数组的递推,把
F
(
i
)
F(i)
F(i) 理解成 C语言的数组,用
f
[
i
]
f[i]
f[i] 来表示第
i
i
i 个斐波那契数,然后就是一个循环就可以解决了。
3. 源码详解
int f[31]; // (1)
int fib(int n) {
f[0] = 0; // (2)
f[1] = 1; // (3)
for(int i = 2; i <= n; ++i) {
f[i] = f[i-1] + f[i-2]; // (4)
}
return f[n]; // (5)
}
- ( 1 ) (1) (1) 定义一个全局的辅助数组;
- ( 2 ) − ( 3 ) (2)-(3) (2)−(3) 初始化 F ( 0 ) = 0 , F ( 1 ) = 1 F(0) = 0,F(1) = 1 F(0)=0,F(1)=1,分别存储到数组的第 0 个和第 1 个位置;
- ( 4 ) (4) (4) 一层循环模拟递推公式;
- ( 5 ) (5) (5) 返回第 n n n 个值 f [ n ] f[n] f[n],也就是斐波那契数列第 n n n 项;
4、n 的第 k 个因子
1. 问题描述
给你两个正整数 n n n 和 k k k,其中两者范围为 1 ≤ k ≤ n ≤ 1000 1 \\le k \\le n \\le 1000 1≤k≤n≤1000。如果正整数 i i i 满足
n % i == 0
,那么我们就说正整数 i i i 是整数 n n n 的因子。考虑整数 n n n 的所有因子,将它们 升序排列 。请你返回第 k k k 个因子。如果 n n n 的因子数少于 k k k ,请你返回 − 1 -1 −1。
2. 问题分析
首先,对于
n
n
n 这个范围,它的因子数撑死
1000
1000
1000 个,实际上会少很多很多,有兴趣可以自己证明下,当然 夜深人静写算法(三)- 初等数论入门 也有关于因子相关的详细内容,不再累述。所以我们可以从
1
1
1 到
n
n
n 枚举,看哪些是
n
n
n 的因子,然后再用一个计数器计数,直到数到第
k
k
k 个就是我们需要求的答案了。
如果全部枚举完,计数器都没有到
k
k
k,那么很显然,没有
k
k
k 个因子,直接返回
−
1
-1
−1 即可。
3. 源码详解
int kthFactor(int n, int k){
int i, cnt = 0; // (1)
for(i = 1; i <= n; ++i) { // (2)
if(n % i == 0) { // (3)
++cnt; // (4)
if(cnt == k)
return i; // (5)
}
}
return -1; // (6)
}
- ( 1 ) (1) (1) 定义 c n t cnt cnt 为因子计数器;
- ( 2 ) (2) (2) 从 1 1 1 到 n n n 枚举;
- ( 3 ) (3) (3) 找到所有是 n n n 的因子的数 i i i;
- ( 4 ) (4) (4) 计数器加一;
- ( 5 ) (5) (5) 如果计数器为 k k k 说明找到了第 k k k 个因子为 i i i,返回 i i i;
- ( 6 ) (6) (6) 如果全部枚举完,计数器都没有到 k k k,那么很显然,没有 k k k 个因子,直接返回 − 1 -1 −1 即可;
5、统计平方和三元组的数目
1. 问题描述
一个 平方和三元组 ( a , b , c ) (a,b,c) (a,b,c) 指的是满足 a 2 + b 2 = c 2 a^2 + b^2 = c^2 a2+b2=c2 的 整数 三元组 a a a, b b b 和 c c c。给你一个整数 n ( n ≤ 250 ) n(n \\le 250) n(n≤250),请你返回满足 1 ≤ a , b , c ≤ n 1 \\le a, b, c \\le n 1≤a,b,c≤n 的 平方和三元组 的数目。
2. 问题分析
首先,考虑最暴力的方法,就是三个数都枚举,然后判断等式是否成立,这样做的时间复杂度为
O
(
n
3
)
O(n^3)
O(n3)。但是我们可以明显的知道,
c
c
c 一定是最大的,所以在枚举
c
c
c 的时候,可以从
a
a
a 和
b
b
b 当中的大者开始,并且当
a
2
+
b
2
<
c
2
a^2 + b^2 \\lt c^2
a2+b2<c2 时,就没必要再枚举
c
c
c,可以跳出循环,大大降低算法的时间复杂度。
3. 源码详解
int max(int a, int b) {
return a > b ? a : b; // (1)
}
int countTriples(《算法零基础100例》(第7例) 素数判定