![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
玉树银花冬飞雪
这个作者很懒,什么都没留下…
展开
-
快慢指针寻找单链表中间值
// FastSearch.cpp : 链表快速查找中间值,快慢指针的方法#include “stdafx.h”#include <stdlib.h>struct LINKLIST{int data;LINKLIST *next;};LINKLIST head = (LINKLIST)malloc(sizeof(LINKLIST));//初始化链表(尾插法)void...原创 2019-03-19 10:20:18 · 320 阅读 · 0 评论 -
剑指offer第二十八题
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:看到这个题目,我脑子里第一个蹦出来的思路是用树来解决,因为这个题目是要记录键对应的值,记录完了过后再去查找键对应的值。而现成的树就是STL里基于红黑树构建的map容器了。...原创 2019-08-23 13:46:55 · 97 阅读 · 0 评论 -
剑指offer第二十四题
题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路:完成两步:(1)找到符合要求的路径(2)对路径的长度进行排序步骤(1)的思路:对树进行前序遍历,每次遍历节点后,将节点值加入path中,并将expectNumber减去节点的值...原创 2019-08-18 15:47:19 · 117 阅读 · 0 评论 -
剑指offer第二十七题
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。这是一道非常令人心酸的题目,花了多久就不说了,说了真是丢人。。。。言归正传,这道题目可以用递归的方式来做,怎么递归呢,先来看一下...原创 2019-08-22 19:48:49 · 86 阅读 · 0 评论 -
剑指offer第二十九题
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路:这道题目刚开始看到,我就想到了用最大堆来实现,那样的话时间复杂度是O(nlogK),空间复杂度是K。但是后来想想,对实现起来可不简单呀,所以先用了冒泡排序,时间复杂度是O(n*K)。后来为了复习一下堆排序,我有实现了一下堆的思路。代码都如下:(1)对排序的...原创 2019-08-25 21:50:21 · 112 阅读 · 0 评论 -
二叉树的相关性质
(1)二叉树的度含义是:二叉树的某个结点的子节点或者直接后继节点的个数,1度代表只有一个子节点或者是单子树,2度代表有两个子节点或者是左右子树都有,二叉树是一个连通的无环图,并且每一个顶点的度不大于3。(2)在二叉树中,一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。(3)在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是...转载 2019-08-21 13:09:38 · 155 阅读 · 0 评论 -
剑指offer第二十六题
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:对二叉树进行中序遍历,将中序遍历的节点连接起来,问题时中序遍历时,前一个节点容易丢失,所以要拿一个节点来保存上一个节点,并对这个临时节点进行更新。具体代码如下:class Solution {public: TreeNode* Convert(TreeN...原创 2019-08-20 15:48:09 · 90 阅读 · 0 评论 -
剑指offer第二十五题
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路:(1)在原来的链表每个节点后面添加一个节点,该节点下面连接着原来节点的下一个节点,并且该节点的值与前面连着的这个节点值相同,比如A->B->C,变成A-&...原创 2019-08-19 22:53:03 · 75 阅读 · 0 评论 -
剑指offer第四题
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路:根据前序遍历的特点,前序遍历第一个数是根节点;根据后序遍历的特点,根节点将后序遍历的数组分成左右两个子树;根据同样的道理,每个节点在后序遍历...原创 2019-07-11 21:01:00 · 149 阅读 · 0 评论 -
剑指offer第五题
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:首先,队列的特点是先进先出,栈的特点是先进后出;两个栈,可以在队列push的时候,将数据先存放到stack1中,如果队列需要pop,则先判断stack2是否是空,如果是空,则将stack1弹出,存放到stack2中,并弹出tsack2的top,实现队列的弹出。如果stack2不是空,则直接弹...原创 2019-07-12 23:06:43 · 99 阅读 · 0 评论 -
二叉树深度优先遍历
分为三种方式:前序遍历,中序遍历,后序遍历前序遍历:先对28的节点进行访问,相当于访问左序,输出28;之后访问其左孩子16,输出16;再访问16的左孩子13,输出13;之后访问13的左孩子,没有左孩子;访问13的中序,不输出;再访问13的右序,不输出;再访问16的中序,16有右孩子;访问16的右孩子,子节点22,输出22的值左序;再访问22的中序,不输出;访问22的右序值,...原创 2019-06-03 10:40:10 · 207 阅读 · 0 评论 -
堆的基本知识
1、堆的定义首先,堆是完全二叉树(二叉树:每个结点有两个子节点),它满足如下性质:(1)任何一个结点都不大于其父结点,这种堆称为大顶堆 或者 任何一个结点都不小于其父结点,这种堆称为小顶堆(2)需要是完全二叉树,最后一层在最左侧2、用数组来存储二叉树首先给二叉树从左至右,从上至下来给每个结点编号,如此编号后,子结点的左结点是父结点的二倍,子结点的右结点是父结点的2倍加1。之后,就可以...原创 2019-05-24 09:58:02 · 231 阅读 · 0 评论 -
三路快速排序算法原理 C/C++
书接上文,上次讲到了双路快速排序,双路快速排序是将等于v(标志数)的数也进行交换,从而避免了在处理有大量重复数据的数组分组时的不平衡。而三路快速排序则是将等于v的数也分成一组,同样可以解决上述问题。其原理如下:1、采用随机排序的方法将某个数作为分割数,放在数组开头,该数定义为v。将小于v的一段数组开头的数索引定义为lt,将需要遍历的数组的索引定义为i,将小于v的一段数组的索引定义为gt,数组的开...原创 2019-05-17 20:06:38 · 1764 阅读 · 1 评论 -
双路快速排序算法原理
看了刘宇波的视频,讲双路快速排序的,原理讲的很直观,程序讲解也一看就懂。这里写一下自己的理解过程,也加深一下自己的理解。首先说一下为什么需要双路排序,在有些带有许多重复数据的数组里,使用随机快速排序或者最简单的快速排序算法时,由于重复的数据会放在原来的索引位置不动,就回导致划分数组时划分的某一部分太长,起不到分段排序的效果,这样就导致算法退化成O(n^2)的复杂度。就像下图:为了解决这个问题...原创 2019-05-14 22:18:42 · 416 阅读 · 0 评论 -
运用归并排序的原理统计数组中逆序对的个数
根据归并排序的思想,在每次归并的时候,需要对划分的两个区域,如下图中的蓝色和黄色区域,然后将temp[i]和temp[j]进行比较,将较小的值(此处对数组进行从小到大排序)存放到原数组arr中在这个归并的过程中,就可以进行逆序对的统计,由于归并时的数组划分的两个区域已经排序完毕,所以数组是有序的,这时,假如temp[i]>temp[j],那么temp[i,mid]这个区间的所有数都大于t...原创 2019-05-19 12:01:49 · 520 阅读 · 0 评论 -
约瑟夫问题求解程序 C++
问题描述:N个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,直到所有人出圈。(模拟此过程,输出出圈的人的序号)这是写的一种解法,后续可能还会研究一下其他解法,写了再发。// joesphus.cpp : 约瑟夫问题程序解法。//#include "stdafx.h"#include <iostream>using n...原创 2019-03-27 12:03:37 · 1254 阅读 · 0 评论 -
循环链表的实现 C++
自己写的一个实现循环链表的小程序,功能不是特别多,实现了一些最基本的方法。// circleList.cpp : 实现循环链表//#include "stdafx.h"#include <iostream>using namespace std;//定义节点class Node{public: int data; Node *next;};//创建循环...原创 2019-03-27 11:01:12 · 695 阅读 · 0 评论 -
剑指offer第三十题
题目描述:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和。(子向量的长度至少是1)方法(1),我自己的做法,做法有点奇葩,思路太复杂...原创 2019-08-26 22:00:24 · 93 阅读 · 0 评论