数据结构和算法
Big_Huang
这个作者很懒,什么都没留下…
展开
-
二叉树 几种遍历方式下的 序列化和反序列化
二叉树的 序列化与反序列化 是一个很有趣的问题,假设树的结构如下序列化:使用 # 代表 空指针 nullptr , ( ) 表示子树的划分,序列化中不存在.此处我采用的序列化为例如前序遍历"1,2,#,4,#,#,3,#,#"前序遍历: 1 (2 # 4 # #) (3 # #)中序遍历: (# 2 # 4 #) 1 (# 3 #)后序遍历: (# # # 4 2) (# # 3) 1层序遍历: 1 2 3 # 4 # # # #前序、后序、层序都能够很好的找到...原创 2021-04-07 19:51:43 · 412 阅读 · 1 评论 -
Leetcode234 回文链表
虽然是一道简单题,但是综合性太强了,设计到链表里面很多技巧与操作。1、回溯法/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(原创 2021-03-22 20:34:50 · 106 阅读 · 0 评论 -
单链表的一些操作
// Copyright: AHNUer// Author: Huang// Date:2020-09-27// Description:some functions about Linklist#include <iostream>using namespace std;typedef int datatype;typedef struct LNode { datatype data; struct LNode* next;}LNode, *LinkLi.原创 2020-09-27 16:59:09 · 110 阅读 · 0 评论 -
C++ 计算字符串的相似度 (编辑距离)的回溯算法 与 动态规划算法
编辑距离 编辑距离指的就是,将一个字符串转化成另一个字符串,需要的最少编辑操作次数(比如增加一个字符、删除一个字符、替换一个字符)。编辑距离越大,说明两个字符串的相似程度越小;相反,编辑距离就越小,说明两个字符串的相似程度越大。对于两个完全相同的字符串来说,编辑距离就是 0。 根据所包含的编辑操作种类的不同,编辑距离有多种不同的计算方式,比较著名的有莱文斯坦距离(Levenshtein distance)和最长公共子串长度(Longest common substring ...原创 2020-09-10 12:22:06 · 3083 阅读 · 0 评论 -
01背包问题 回溯法 与 动态规划 两种方案的求解
0-1背包问题是个很经典的问题,规模较小时常用回溯法来类似于枚举的方法进行所有的选择方案的求解,但是由下图显而易见,这个过程中进行了很多次重复性的计算,故完全可以用动态规划的方式,利用状态转移表提前计算中间过程,空间换时间的方式。1、回溯法 该方法理解较为容易,主要依靠上述的图,不断走所有的决策路径,找到需求的最大值。开始先不断递归到最大深度,此时什么都不装,是上述图中第一个叶子结点的状态,计算此时的状态,并作为最大的价值,然后回溯,装进去第i个物品,计算...原创 2020-09-08 17:05:32 · 2562 阅读 · 0 评论 -
Leetcode 单链表反转
单链表反转问题有很多好的处理方法,做题的时候看到一种很好的解决思路。新建三个指针分别为 pre、cur、next 。pre作为新建链表的头指针,cur作为当前待转移元素的指针,next作为除待转移元素以为,剩余元素的头指针三个指针设置的很合理,分别对应有效的位置,避免丢掉链表的位置。其中next是在cur不为NULL这一条件成立才会创建。如果采用循环外创建,循环内使用 next = next -> next 这样的方式更新指针。此时next达到NULL时,cur仍然满足循环条件,此时.原创 2020-09-03 20:01:33 · 120 阅读 · 0 评论 -
Leetcode142. 环形链表 II 分析与解答
关于链表中是否存在环形列表的问题,可以查看超链接,关于环形列表连入位置的问题,可见下述分析图 上图结论可以看出来,如果在两节点相遇后,一个新的指针从A走到B,所需要的步数,刚好能让另一个指针从C走到B,n-1表示走了 n - 1 圈,此时不管走多少圈,因为有c的存在,最终肯定是走到了B点,故刚好两个新指针重合,这也是循环终止的标准,具体代码见下面了:class Solution {public: ListNode *detectCycle(ListNode *head) { ..原创 2020-09-02 19:18:44 · 139 阅读 · 0 评论 -
Leetcode报错:runtime error: member access within null pointer of type ‘ListNode‘ (solution.cpp)
Leetcode检测链表是否有环的问题中遇到这个问题,开始的时候是我把链表理解错误,初始化快慢指针的时候,是将头结点赋值给新建指针,即新建快慢指针是与头指针一样指向第一个数,而非是指向头结点(初学导致理解错误),这样分析一下代码就能修改正确了。开始写的代码如下:class Solution {public: bool hasCycle(ListNode *head) { if (head == NULL) return false;原创 2020-09-02 16:48:30 · 1599 阅读 · 0 评论 -
C++ 快速排序
快排有点类似于归并排序,但是它是先按照大小分好组,再排序,而非归并是先分解,排序再合并部分。开始先随机找个数,通过原地交换,使得该值左边全小于它,右边大于它。不断递归过程中进行排序过程。快排由于中间存在交换操作者,故为非稳定排序,但是其实原地排序,空间复杂度为O(1),其时间复杂度最差O(n^2),一般O(nlogn)。其整体流程 和 单步过程如下:整体流程:void __quick_sort(int* arr, int left, int right) { if (lef原创 2020-08-18 17:05:20 · 506 阅读 · 0 评论 -
C++ 归并排序 含哨兵与不含哨兵 写法
归并排序利用分治思想,通过不断的用递归将大问题化解为小问题,是一种稳定的排序算法,时间复杂度为O(nlogn),但是由于开辟了额外的空间,空间复杂度为O(n)。在代码实现部分,分解部分利用递归的方法,不是很难实现,合并部分是关键,普通未引入哨兵代码需要考虑到边界问题,但是引入哨兵,能够更加简化代码。不含哨兵:void __merge(int* arr, int left, int mid, int right) { int i = left, j = mid + 1, k = 0;原创 2020-08-18 16:13:14 · 490 阅读 · 0 评论