Coding Practice,48天强训(4)

Topic 1:Fibonacci数列(斐波那契)

斐波那契,老朋友

还是比较简单的,生成离n最近的斐波那契数列,如果生成到>n了就终止,<=n的斐波数都会放在容器里,此时多生成一次,因为n有可能靠近比它小的那个斐数 也有可能靠近比它大的那个斐数,所以要多生成一个最后相减来比小。整体没啥难度.

而且明显能感觉这两天训练之后,工程能力有很大的进步,思路、函数接口调用都比较通畅


Topic 2:单词搜索 图论 深广度优先搜索DFS

寻找相邻元素涉及一些图论,回溯,广度搜索相关的知识, 由于这题和leetcode 79 单词搜索一个系列的,顺便解决掉,我们先看79这道

图论这边我还没有上,所以可能需要花一些时间来学习一下DFS (深度)和 BFS(广度) 原理,这里采用DFS,其本质其实是在一颗决策树中不断遍历试错,如果遇到错误路线便回溯到上一个分叉节点,再进行新路线的遍历

如图我们有一组char形成的矩阵,在其中我需要找出ABCDE,那么把选择路径转化成树的形式:

(0,2)这种代表了对应节点在矩阵中的横纵坐标,绿线是深度遍历的路径,红线是发现本路径不通,回溯到之前的分叉节点

那么基于此,我们设计DFS函数,它的参数是这样的

        

board:        当前的二维字符数组(矩阵)

word/s:        表示需要搜索的目标单词

i:        当前搜索的起始位置的行索引(横坐标)

j:        纵坐标

index/pos:        当前匹配到单词的第几个字符

返回值是bool,表示从当前位置 (i, j) 开始,是否能匹配到单词的剩余部分(从 index 开始)。

  • 返回 true,表示从当前位置可以匹配到单词的剩余部分。

  • 返回 false,匹配失

二维矩阵的搜索中需要注意一个问题——不能走回头路,因为走回头路会进死循环,所以通常会用个bool visit[][]数组来表明,该位置的元素是否被搜索过

还有一种方法是修改原始数组的值,譬如把已经走过的A改成一个星或者点 * . ,这样就避免重复走路,但是要注意在部分场景下是不让改的,要搞清楚条件,当然,修改后也能恢复,但是很麻烦,所以还是推荐第一种,用个bool数组来判断,更方便

其中还有一个技巧,通过向量下标映射的方式来优化代码

回到强训的题目上

总体思路都是差不多的,基本没啥区别

写了一遍之后算是轻车熟路能完全默写出来了,但是还是要反复复习,在思路上还是没有特别清楚,属于是有点靠短时记忆记下来了,之后需要复习


Topic 3:杨辉三角

这一题所需的二维数组的知识和leetcode 118杨辉三角那一题很像,用的是vector<vector<int>>来模拟二维数组

比较简单,主要考察一些容器和输出的基础知识:

  这里注意 vector<vector<int>>是这样初始化的,相当于调vector的构造,创建n个元素的vector,其中每个vector也是一个vector<int>

杨辉三角的性质要明确

从第三行(下标2)开始,从每列2(下标1)开始,到<每列尾结束,size()求出来的个数-1是最后一个数的下标,

杨辉三角的特性是从第三行开始,以上说到的元素,等于本列上一行的前一个+本列上一行的自己

下标对应图

总结:整体难度都不大,图论DFS那里需要多看看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值