数据结构与算法
文章平均质量分 57
以刷题为主
Oragen
这个作者很懒,什么都没留下…
展开
-
leetcode--解数独
要求:编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。注:空白格用 ‘.’ 表示。解法描述:约束编程:解数独的一个约束条件是一个数字只能在当前行、当前列和当前的格子中仅能出现一次。这意味这每次放置一个数字都要设置相...原创 2020-04-04 12:04:12 · 320 阅读 · 0 评论 -
单链表的成环、相交、逆置和从尾到头打印
如果链表中含有圆环,那么对链表的遍历会有什么影响呢?毋庸置疑,影响是很大的。单判断单链表的成环的方法有两种:首先介绍一种常用方法:试想有一个圆形跑道,甲乙两人同时在跑道的起点,如果甲的速度是乙的两倍,那么当乙跑完半圈时,甲跑完一圈回到起点,乙跑完一圈回到起点时,甲跑完两圈也回到起点,这样的话,甲乙重新在起点相遇。于是乎我们可以定义两个指针p1、p2均指向链表的第一个节点,指针...原创 2018-07-09 19:49:17 · 396 阅读 · 0 评论 -
KMP和朴素匹配的字符串匹配算法
KMP和朴素匹配解决的问题:字符串匹配。给你两个字符串,寻找其中一个字符串是否包含另一个字符串,如果包含,返回包含的起始位置。 如下面两个字符串: char *str = “abcababcabc”; char *ptr = “abcbac”; str有一处包含ptr 在str的下标5处开始包含ptr。问题很简单,下面来分别介绍两种算法: 朴素匹配算法说明:朴素匹...原创 2018-07-05 10:59:30 · 348 阅读 · 0 评论 -
排序算法(三)堆排序
算法描述:要理解堆排序首先我们先来认识一下堆。堆其实就是一颗完全二叉树,而堆又可以分为大根堆和小根堆。所谓大根堆就是双亲节点大于左右孩子节点的完全二叉树;相反,小根堆就是双亲节点小于左右孩子节点的完全二叉树。而堆排序就是利用了堆的这种特性来将乱序的数据进行排序的。首先在进行堆排序的时候我们先根据乱序的数据将堆建成。在我们已知根节点的元素下标 i,则可知其左孩子为 i+1,右孩子为 i+2,当...原创 2018-08-10 00:03:21 · 205 阅读 · 0 评论 -
排序算法(四)归并排序
算法描述:通过将乱序的数据划分为某一长度的归并段,并使得归并段中的数据有序,然后在对归并段进行扩充,最后合并为一个有序的归并段。归并的核心思想运用的是分治法的思想,分的思想是将原始数据划分为若干个段,治的思想是分别对各个段进行排序。递归进行,直至整个数据合并为一个段。这里实现的是二路归并,下面是二路归并实现的图解: 由图所示,采用分治法很容易就将乱序的数据排序好,而且归并排序的最好、最...原创 2018-08-11 18:05:20 · 512 阅读 · 0 评论 -
排序算法(一)直接插入与希尔排序
算法描述:顾名思义,直接插入排序就是将待插入的数据插入到该数据之前的有序序列的正确位置处,使得序列依然有序的排序算法。当数据有序且不需要移动是时间复杂度为O(n),当为逆序时,每次插入都需要移动数据,效率最差,则时间复杂度为O(n^2)。在插入过程中,需要用一个临时的辅助空间来保存待插入的数据,所以该算法的平均时间复杂度为O(n^2),空间复杂度为O(1)。另外,由于数据是一个一个逐个插入,所以这...原创 2018-08-08 16:21:14 · 265 阅读 · 0 评论 -
排序算法(二)快速排序(递归与非递归实现)
快速排序算法描述:快速排序的实现原理是在待排序的数据中取出一个数作为键值,比较序列数据与其的大小,大于该键值的数据放在该键值右边,小于的放在左边。完成后再对键值两边的序列递归上述操作,这样经过若干步后数据就排序好了。过程如下图:如上描述的我们可以将快速排序分为如下几个步骤:先从数列中取出一个数作为基准数。分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左...原创 2018-08-08 23:26:20 · 5031 阅读 · 3 评论 -
二叉树的递归与非递归遍历
遍历时对树的一种基本运算,所为遍历二叉树就是按一定的规则和顺序走遍二叉树的所有节点,是每一个节点都被访问一次,有且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个节点转化为一个现行序列来表示。#include<iostream>#include<stack>using namespace std;typede原创 2018-10-29 21:56:28 · 485 阅读 · 0 评论