算法&数据结构
文章平均质量分 65
算法&数据结构
请叫我阿渌
凡有所学,皆成性格。
展开
-
字符串之 KMP 匹配算法
kmp 算法是匹配一个字符串 str 包含的字串 substr 的开始索引的算法(成功返回开始索引,失败返回 -1),时间复杂度为 O(N),N为str的长度。原创 2023-02-25 22:58:37 · 475 阅读 · 0 评论 -
排序(冒泡、插排、选择、桶排、希尔、堆、归并、快排) C++
排序(冒泡、插排、选择、桶排、希尔、堆、归并、快排) C++前提说明:排序可以是升序,可以是降序,可以从后往前排,可以从前往后排,结果正确即可,本文以升序为主。随机数组生成void randomArr(int arr[], int n){ for (int i = 0; i < n; i++) { arr[i] = i; } // 如果你要产生0~99这100个整数中的一个随机整数,可以表达为:int num = rand() % 100; for (int i原创 2020-06-28 14:32:56 · 280 阅读 · 0 评论 -
TopK问题求解(堆排、快排、快排优化(bfprt算法求中位数))
TopK问题求解(堆排、快排、快排优化(bfprt算法求中位数)) 问题(一)问题阐述:在一个无序队列中,找到最大(或最小)的 K 个数。(二)解决方案在本文中,我们以找寻最大 K 个数为目的。(1)堆排序解法首先,简单阐述一下堆排序的思想:对于 n 个数的无序队列,将其视为一棵完全二叉树。然后,从最后一个父节点(father = n / 2 - 1)开始遍历,到堆顶节点(father = 0)为止,将原二叉树调整为最大(小)堆结构,然后从队尾开始遍历,与堆顶元素交换,每次交换,待排序队列长原创 2020-06-05 21:38:41 · 579 阅读 · 0 评论 -
Linux 进程 fork、exec、wait练习
fork、exec、wait练习父进程 fork 3 个子进程,三个子进程一个调用 ps 命令,一个调用自定义程序 1(正常),一个调用自定义程序 2(会出段错误)。父进程使用 waitpid 对其子进程进行回收;#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <unistd.h>#include <sys/wait.h>int main(int arg原创 2020-08-26 19:38:58 · 499 阅读 · 0 评论 -
回溯算法(全排列、组合、N皇后问题)
回溯算法暴力穷举,这是不可避免,因为回溯法没有重复子结构,所以其时间复杂度大于等于O(N!);前言本文章内容部分参考公众号labuladong关于回溯算法的讲解,仅为笔者日后复习,或读者参考学习,无商业用途。实质:决策树的遍历三要素路径:当前已经做出的决策;选择列表:当前可以做出的决策;结束条件:到达决策树底层,一般就是选择列表为空;回溯递归框架result = []def backtrack(路径, 选择列表): if 满⾜结束条件: result.add(路径) r原创 2020-08-02 20:55:14 · 610 阅读 · 0 评论 -
字符串数字相加
字符数字相加思路待更代码实现#include <iostream>#include <string>#include <algorithm>using namespace std;string stradd(string num1, string num2){ int n1, n2, n3, carry; n1 = num1.size()-1; n2 = num2.size()-1; n3原创 2020-08-13 18:00:08 · 1020 阅读 · 0 评论 -
链表学习之复制含随机指针的链表
将每一个新节点放在原来节点的后面,并连接上下一个节点的方式,这样通过next就能够定位到新节点,通过next的next就能找到原来的下一个节点。要求:时间复杂度O(N),空间复杂度O(1);时间复杂度O(N),空间复杂度O(N);时间复杂度O(N),空间复杂度O(1);原创 2023-02-18 17:56:14 · 769 阅读 · 0 评论 -
链表学习之找到两个链表相交的第一个节点
如果有环,快慢指针一定会在环内相遇,当相遇发生之后,快指针回到头节点,慢指针不动,快慢指针同时一次一步的移动,直至相遇,相遇的位置即为入环的第一个节点。最好理解和想到的方法就是,遍历两个链表,计算出两个链表的长度差值,让长链表先移动差值步,接着继续同时遍历,直到相遇或都为nullptr。给定两个链表,这两个链表可能有环,可能无环。判断这两个链表是否相交,相交则返回第一个相交的节点,不相交则返回nullptr。或者使用交换遍历的方式,因为无论如何两个链表都遍历的话,最后要不就相交,要不就都为nullptr。原创 2023-02-18 17:55:54 · 639 阅读 · 0 评论 -
链表学习之链表划分
整体思路就是,遍历一遍链表,把节点存入数组,对数组快排,然后再遍历数组,生成将节点重新连接。要求:调整之后节点的相对次序不变,时间复杂度不高于O(N),空间复杂度不高于O(1)。将单向链表值划分为左边小、中间相等、右边大的形式。中间值为pivot划分值。注意处理,小于部分、等于部分、大于部分有缺失的情况。主要是使用6个指针记录3个部分的头、尾位置。但最容易想到和实现。原创 2023-02-18 17:54:02 · 755 阅读 · 0 评论 -
链表学习之判断链表是否回文
如果要满足,奇数时到达中间位置,偶数时向上取整的位置。我们应该在快指针遍历完之后,判断是否为偶数,可以通过快指针是否为nullptr判断,然后偶数情况下慢指针先往后移动一步,然后在开始遍历剩下部分入栈。其中,反转后半部分链表的函数,即为上文的反转单链表算法。再返回之前需要把链表复原。相对于方法1节省一半的空间,但时间复杂度和空间复杂度不变。该方法,时间复杂度仍为O(N),空间复杂度降低为O(1)。要求:时间辅助度O(N),空间复杂度O(1)特别注意,奇数和偶数情况下的指针定位。原创 2023-02-18 17:54:17 · 895 阅读 · 0 评论 -
链表学习之反转链表
要求:长度为N的链表,时间复杂度为O(N),额外空间复杂度为O(1)。分别实现单向链表和双向链表的反转。原创 2023-02-18 17:52:14 · 802 阅读 · 0 评论 -
链表学习之基础概念
/ DATATYPE 可以是任意存放数据的类型,如int, string等 DATATYPE val;} };链表在插入和删除上的时间复杂度为 O(1),在查询上的时间复杂度为 O(n)。适用于数据量不固定,频繁增删,少量查询的场景。原创 2023-02-18 17:49:49 · 544 阅读 · 0 评论