数据结构
西瓜LXF
这个作者很懒,什么都没留下…
展开
-
C++ vector和list的区别
1.vector数据结构vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。因此能高效的进行随机存取,时间复杂度为o(1);但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为o(n)。另外,当数组中内存空间不够时,会重新申请一块内存空间并进行内存拷贝。2.list数据结构list是由双向链表实现的,因此内存空间是不连续的。只能通过指针访问数据,所以list的随机存取非常没有效率,时间复杂度为o(n);但由于链表的特点,能高效地进行插入和删除。转载 2021-12-03 10:59:00 · 1688 阅读 · 0 评论 -
C++ 堆栈问题
C/C++编译的程序内存分配有五个区域描述生存周期举例堆由程序员主动分配与释放new-delete malloc-freechar * p1 = (char*) malloc(10) 注意p1指针本身是在栈中的栈由编译器自动分配释放 ,存放函数的参数值,局部变量的值等函数中-函数执行网,类-类销毁时int fun(int a){int b = 2;a = 3 ;return a*b;}静态区全局变量和静态变量的存储是放在一块的,初始化的程序结束后由系原创 2021-12-03 10:52:39 · 235 阅读 · 0 评论 -
降序链表合并
题目:将两个降序链表合并为一个新的 降序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。如:{6,5,1}{8,5,2} 合并后:{8,6,5,5,2,1}ListNode* MergeTwoLists(ListNode* list1, ListNode* list2){ // write code here ListNode* node = new ListNode(-1); ListNode* node_0 = node;//备份头 while (l原创 2021-09-30 15:44:30 · 807 阅读 · 0 评论 -
四个排序,排序
1、冒泡排序冒泡排序就是把最大值向后移,依次把相邻两个数比较,前面数大就交换,首先依次0(n-1)个数相邻比较,,再0(n-2)个数相邻比较,直到0~1void bubbing_sort(int num_list[],int lenth){ for (int i = 0; i < lenth; i++) { for (int j = 0; j < lenth - 1 -i; j++) { if (num_list[j.原创 2021-09-22 15:04:10 · 155 阅读 · 0 评论 -
才发现自己不会二分法
今天看到一道二分法的题,别人花了500行左右讲解,二分法这么简单的需要这么讲解吗?现实很打脸!!!题目:在一组有序数组中,查找数值X,找到就返回数值对应的序号,未找到就返回-1。这是楼主第一遍写的:int findNum_error_1(const vector<int>& vec,int num){ int start = 0; int end = vec.size() - 1; while (start < end) {原创 2020-07-16 14:14:04 · 107 阅读 · 0 评论 -
N皇后经典回溯算法
N皇后题目:给你一个N*N的棋盘,放置N个皇后,让皇后之间不攻击;攻击规则:皇后可攻击同行、同列、对角线上的所有皇后。题目分析:如果没有对角线限制,那么这道题就是一个全排列(本人一篇全排列文章:https://blog.csdn.net/u012093557/article/details/107336803)加上对角线限制后,就有很多格子不能放皇后。判断对角线,和同行同列能不能放置,还不是这道题的精髓,这道题的精髓是,前面的都可以,后面发现没法有效放置N个,如何去检验从那一步开始放置错误了。以经典的原创 2020-07-15 12:15:07 · 140 阅读 · 0 评论 -
输入一组不重复数字,全排列
全排列是我们读书时课堂上已经学过东西,给出1,2,3三个数,有多少个组合方式呢?123,132,213,231,312,321很快我们就能给出这组数的全排列,全排列个数=N*(N-1)*(N-2)*…*1=N!看起来很easy,我以为代码实现起来分分钟的事情,然后并没有这是我一口气写完的代码,输出却什么都没有vector<vector<int> > Permutation(vector<int> num_list){ vector<vector&原创 2020-07-14 14:09:07 · 475 阅读 · 0 评论 -
凑零钱问题
题目:给你k种面值的硬币,面值分别为 c1, c2 … ck,每种硬币的数量无限,再给一个总金额 amount,问你amount 最少需要几枚硬币凑出这个金额,如果不可能凑出,算法返回 -1解析:假设面值c1,c2…ck是顺序排列,首先我们查看cK,最大可能 maxCout = amount /ck 个ck。那么剩下的钱amount - maxCout *ck从c1,c2…ck-1。如果凑不齐,最大面值ck就从maxCout -1个开始。剩下的钱amount - ( maxCout - 1) *ck从c原创 2020-06-10 16:04:15 · 1134 阅读 · 0 评论 -
字符串匹配
收到一个算法题,把它记录下来题目:给你一个字符串s和一个字符规律p,请你来实现一个支持 ‘.’ 和 ‘’ 的正则表达式匹配。所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。s可能为空,且只包含a-z的小写字母p可能为空,且只包含a-z的小写字母,以及字符 ‘.’ 和 '’‘.’ 匹配任意单个字符'’ 匹配0-N个前面那个字符示例:aa a falseaa a原创 2020-06-10 11:11:05 · 392 阅读 · 0 评论 -
二叉搜索树的插入和删除
1、什么是二叉搜索树若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的左、右子树也分别为二叉排序树。2、插入节点二叉搜索数如何插入节点呢,我们来看看二叉搜索树的性质,首先二叉搜索树无重复值;如果插入值已经存在,则不插入。二叉搜索数根节点大于左子树所有节点,小于右子树所有节点,插入值如果大于根节点值,则插入右子树;插入值如果小于根节点值,则插入左子树。如果根节点为空,那么创建节点,根节点为插入节点例:现在想插图5原创 2020-06-06 17:54:47 · 472 阅读 · 0 评论 -
二叉树之已知前序遍历、中序遍历求二叉树
以上一篇的二叉树为例https://blog.csdn.net/u012093557/article/details/106496635这个二叉树的前序、中序分别如下所示,1, 2,3,4,5,6,7,8, 9,10,11,4,3,2,6,5,8,7, 1, 10,9,11,解题思路:前序遍历是根-》左-》右,那么第一个数一定是根节点,这里1就是根节点。中序遍历左-》根-》右,那么1拿到中序遍历就可以分割左、右子树,中序遍历左子树:4,3,2,6,5,8,7,右子树:10,9原创 2020-06-02 17:38:29 · 3373 阅读 · 0 评论 -
二叉树之求二叉树中最大路径和
LeetCode中一道求二叉树中最大路径和的题目,一起来复习下二叉树的遍历。以如图所示二叉树为例1、二叉树前序遍历 根-》左子树-》右子树void PreorderErgodic(TwoTree* p){ if (p != NULL) { printf("%d,",p->value); PreorderErgodic(p->left); PreorderErgodic(p->right); }}//1,2,3原创 2020-06-02 15:52:08 · 1831 阅读 · 0 评论 -
双向链表之斐波那契数列
今天看单项链表和双向链表的时候,一下子想到了斐波那契数列,如何用链表管理斐波那契数列呢?首先我们来看看单链表!1、单链表结构class SingleLinked{public: SingleLinked(int value) { m_value = value; next = NULL; } int m_value; SingleLinked* next;};2、单链表如何遍历数据的呢,比如我们要打印链表的数据,我们打印是原创 2020-06-02 09:12:02 · 457 阅读 · 0 评论