
数据结构和算法
吕白_
希望自己技术越来越强
展开
-
结构体与共用体的内存分配问题
以前单纯以为结构体 共用体的内存大小只需要算出每个成员的内存大小求总和就是了,慢慢才知道并不是这样。那么为什么会出现内存对齐呢, 大部分的参考资料都是如是说的: 1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。 2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐原创 2017-06-21 10:36:29 · 833 阅读 · 0 评论 -
leetcode: Generate Parentheses
转自博客给定n对括号, 编写一个函数来生成所有格式良好的括号组合例如, 给定n = 3, 解集为:[ "((()))", "(()())", "(())()", "()(())", "()()()"]class Solution{ public: vector<string> generateParenthesis(int n) ...转载 2019-03-28 20:56:58 · 181 阅读 · 0 评论 -
给定一个无序数列, 找出右边第一个比他大的数
今天面腾讯, 这道题没想出来题目要求基本如题, 然后只有一个元素的时候 (最右末尾元素) 对应值为空当时面试官要求时间复杂度为 O(n), 想了半天也没想出来提示了使用栈和栈顶指针做, 过了一会时间不够了就问下面的题了, 现在回过头来看一下这道题这道题我一开始想的是栈中存储对应元素, 但是怎么推都达不到 O(n) 的复杂度, 后来百度了一下, 看到一篇博客, 原来栈中可以存储数组的索引...原创 2019-03-21 20:22:38 · 2096 阅读 · 0 评论 -
堆排序学习总结
文章目录@[toc]基本思想时间复杂度代码实现基本思想堆是一种完全二叉树, 分为大顶堆和小顶堆.本篇博客我们默认要进行一个升序排序, 那么我们要构建一个大顶堆堆排序的算法思想就是先构建一个大顶堆之后, 堆顶元素就是该数列最大值, 然后我们将其(即array[0])和数组末尾元素(即array[i])交换, 然后将剩下的元素(即array[0] 到 array[i - 1])重新进行调整...原创 2019-03-11 15:39:33 · 739 阅读 · 0 评论 -
DP : 最长递增子序列
文章目录问题描述时间复杂度为O(n2)时间复杂度为O(n logn)问题描述对于一个数字序列,请设计一个复杂度为O(nlogn)的算法,返回该序列的最长上升子序列的长度,这里的子序列定义为这样一个序列U1,U2…,其中Ui &lt; Ui+1,且A[Ui] &lt; A[Ui+1]。给定一个数字序列A及序列的长度n,请返回最长上升子序列的长度。测试样例:[2 ,1, 5, 3...原创 2019-03-07 15:51:42 · 295 阅读 · 0 评论 -
DP : 0-1背包问题
文章目录问题描述解题思路状态转移方程不将第 i 种物品放进背包将第 i 种物品放进背包优化空间复杂度代码实现问题描述给定一组物品, 每种物品都有自己的重量和价格, 在限定的总重量内, 我们如何选择, 才能使得物品的总价格最高每种物品只有一件, 要么放进背包, 要么不放, 即只能选择 0 / 1个, 该问题称为0-1背包解题思路设 F(i, j)表示放进前 i 种物品, 总容量不超过 j...原创 2019-03-10 16:58:18 · 400 阅读 · 0 评论 -
DP : 最长公共子序列
文章目录求解思路代码实现这篇博客是听完郭炜老师的课之后的总结求解思路现在假设求两个字符串s1, s2的最长公共子序列s1长度为len1, s2长度为len2, 我们设MaxLen(i, j)表示:s1左边 i 个字符形成的子串, 与s2左边 j 个字符形成的子串的最长公共子序列长度i, j 从 0 开始那么我们最终求解的是 MaxLen( len1, len2 )的值那...原创 2019-03-08 22:26:47 · 372 阅读 · 0 评论 -
平衡二叉树(AVL树)的平衡原理以及插入,删除操作
文章目录AVL树的定义AVL树不平衡的情况左子树的左子树插入结点 (左左)右子树的右子树插入节点左子树的右子树插入节点右子树的左子树插入节点删除结点插入节点更复杂的情况所有代码测试结果AVL树的定义平衡因子 : 树中某结点其左子树的高度和右子树的高度之差AVL树中的任意一个结点, 其平衡因子的绝对值小于2AVL树是一种特殊的二叉搜索树 (BST树), 相对于数据极端情况下, 二叉搜索树会...原创 2019-02-13 21:59:47 · 32187 阅读 · 16 评论 -
红黑树(R-B Tree)的插入以及与AVL树的区别
文章目录红黑树的定义红黑树的插入操作红黑树的自平衡case 1case 2case 3case 4case 5总结红黑树与平衡二叉树红黑树的定义红黑树是特殊的二叉搜索树, 拥有自平衡的能力, 解决了BST树有可能退化成单链表的情况, 效率良好, 可以在O(log N)时间内完成查找, 删除, 添加. 红黑树应用很广泛, 主要用来存储有序的数据, STL 中的 set, map 等的内部实...原创 2019-02-18 21:13:06 · 636 阅读 · 0 评论 -
二叉搜索树 (BST) 的插入, 删除, 查找
文章目录二叉搜索树 (BST) 的定义BST 的构建BST 的插入BST 的查询BST 的删除BST 的检验二叉搜索树 (BST) 的定义二叉搜索树 (Binary Search Tree)的结点定义一般如下typedef struct Node { int key; //节点关键值 Node* left; //左子树指针 Node* right; //右子树指针} ...原创 2019-01-27 20:50:41 · 1858 阅读 · 1 评论 -
动态规划: 钢条切割的三种解法
/*钢条切割不同长度的钢条对应不同的价格给定一定长度的钢条,怎样切割利益最大注意: 最优解可能是完全不需要切割*/#include &lt;vector&gt;#include &lt;iostream&gt;using namespace std;//给定长度从1到10对应的不同价格vector&lt;int&gt; price{0, 1, 5, 8, 9, 10, 1...原创 2019-01-24 17:52:16 · 889 阅读 · 0 评论 -
快速排序
#include<stdio.h>int a[100];int n;void quicksort( int left,int right );int main(){ int i,j; scanf( "%d",&n ); for( i = 0;i < n;i++ ) { scanf( "%d",&a[i] ); //输入数据 } qui原创 2017-12-20 21:51:45 · 268 阅读 · 0 评论 -
哈夫曼树、哈夫曼编码 C++实现
#include<iostream>using namespace std;struct huff{ int weight; huff *left,*right;};int *coding = new int[10];class huffmantree{ huff *Tree; public: huff *get(); huff init();原创 2017-11-04 15:10:03 · 763 阅读 · 6 评论 -
非递归遍历二叉树
/******************************************************* >非递归遍历二叉树(先序、中序、后序遍历) *****************************************************/#include<iostream>#include<stack>using namespace std;struct nod原创 2017-10-25 21:52:31 · 750 阅读 · 0 评论 -
前缀、中缀、后缀表达式转换
这三种都是对表达式的记法,区别只在于运算符与操作数的相对位置的差异,中缀表达式就是我们一般使用的相对容易理解的表达式,但是对于计算机来说,就很麻烦了,而前缀和后缀表达式对于计算机来说才是容易理解的版本 举例:(3 + 4) × 5 - 6 就是中缀表达式- × + 3 4 5 6 前缀表达式3 4 + 5 × 6 - 后缀表达式前缀表达式的计算机求值: 从右至左扫描表达式,遇到数字时,将数字原创 2017-09-21 11:16:13 · 494 阅读 · 0 评论 -
抽象数据类型(ADT)
说到抽象数据类型,那么就得先提到数据类型数据类型指的是一个值的集合以及定义在这个集合上的一组操作为什么要有不同的数据类型呢 当我们计算1+1的时候,只需要很小的存储空间,但是当我们去计算10000+100000的时候,所需要的空间就会大许多,那么我们为了去区分这些类别的差异,就有了不同的数据类型来更精确的确定存储空间的划分第一次看到 int a;的时候,可是一脸懵逼,以为只是告诉我们这是一个“int原创 2017-09-12 21:10:48 · 11223 阅读 · 0 评论 -
最长不重复子串 (哈希 + DP)
自己没想出来, 代码来自别人的博客, 但是找不到出处了…代码实现int longestSubstring(string str){ //利用哈希的思想,key是每一个字符,value是其对应的下标 // 存储上一个重复字符的位置 int* lastPosition = new int[256]; //初始化,首字符之前没有与其重复的字符,都为-1 ...转载 2019-04-17 16:46:01 · 907 阅读 · 0 评论