![](https://img-blog.csdnimg.cn/20200117173309704.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 61
原创讲解一系列经典算法
AlexanderGan
对计算机和机器人的世界充满好奇。
展开
-
Rust__基于双向链表Safe实现的简单队列(ListQueue)
Rust__基于双向链表Safe实现的简单队列(ListQueue) 一个简单,不具有泛型的safe双向链表,可以在刷题的时候使用。原创 2022-06-01 21:35:16 · 592 阅读 · 0 评论 -
哈希表__C++泛型实现简易的哈希表
哈希表__C++泛型实现简易的哈希表1.简易的哈希表支持Value的泛型, Key值在这里只能用int型,如果要使用其他类型作为Key还需要定义hashCode函数,获取从其他类型映射到int型的哈希函数。这里的扩容机制采用的是负载因子超过限制或者桶中元素超过桶数,则扩容到二倍Size附近的质数,质数可以减少哈希碰撞。下面是简单的原理实现。template<typename K, typename V>struct Pair { Pair(const K& k, const V&原创 2021-09-20 11:11:28 · 290 阅读 · 0 评论 -
堆__C++泛型实现简易的优先队列
堆__C++泛型实现简易的优先队列最近复习优先队列的实现时,想到了使用泛型的方法来实现,可以灵活的调整优先队列的排序方法,这里小小的分享一下:template<typename T>class Less {public: bool operator()(const T& a, const T& b) { return a < b; }};template<typename T>class Greater {p原创 2021-08-28 20:36:45 · 150 阅读 · 1 评论 -
nginx_图解nginx关键数据结构_双向链表ngx_queue_t
nginx_图解nginx关键数据结构_双向链表ngx_queue_t一、结构解析 ngx_queue_t是一种环形双向链表的数据结构,这个链表不会负责分配内存来存放元素,ngx_queue_t只是将已经分配好内存的元素用双向链表连接起来。 链表的优势在于,可以高效的执行插入、删除、合并等操作。移动链表元素的时候只需要修改链表的指向,因此适合频繁修改容器的情况。 nginx中,ngx_queue_t主要功能有 (1)实现了简单的插入排序 (2)支持两个链表的合并与拆分 (3)获取原创 2021-04-26 21:53:16 · 252 阅读 · 0 评论 -
缓存置换_LRU与LFU算法的C++实现
缓存置换_LRU与LFU算法的C++实现一、LRU算法的实现示例1输入[[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3返回值[1,-1]#include<unordered_map>struct Node{ Node(){} Node(int k, int v): _k(k), _v(v){} int _k; int _v;};class Solution {public:原创 2021-04-03 11:48:28 · 295 阅读 · 1 评论 -
位运算__从基本逻辑操作到LeetCode位运算习题
位运算__从基本逻辑操作到LeetCode位运算习题一、位运算的常用技巧 常用的位运算符号包括:“ ^ ” 按位异或、“ & ” 按位与、“ | ” 按位或、“ ~ ”按位取反、“ << ”算术左移和“ >> ”算术右移。下面以8位二进制数为例子,展示基本逻辑操作,x代表一个八位二进制数。//或运算x | 0b00000000 = xx | 0b11111111 = 0b11111111x | x = x//与运算x & 0b00000000原创 2021-02-26 15:16:12 · 273 阅读 · 0 评论 -
归并思想__LeetCode数组中的逆序对&计算右侧小于当前元素的个数
一、剑指Offer 51 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。题目地址示例 1:输入: [7,5,6,4]输出: 5这里的思路主要就是利用了归并的思想,举个例子,对于[1,4,5,7] ,[2,3,6,8]这两个待归并的序列, 当a[i] > a[j]的时候 显然 [i, m]这个闭区间的所有元素都大于a[j],此时可以将j为2时候的逆序对全部加入,个数为 m - i + 1原创 2021-02-22 14:58:20 · 227 阅读 · 0 评论 -
动态规划与贪心_上升子序列系列问题
动态规划与贪心_上升子序列系列问题一、最长递增子序列给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。来源:力扣(LeetCode)示例1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例2:输入:nums = [0,1,0,原创 2021-01-18 14:01:42 · 193 阅读 · 0 评论 -
综合搜索_图解LeetCode_934最短的桥
在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。返回必须翻转的 0 的最小数目。(可以保证答案至少是 1。)来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shortest-bridge思路:先用dfs搜索到第一座岛,将所有的1置为2,并把第一座岛1周边为0的坐标全部加入队列中,便于后边进行bfs,在bfs的时候围绕之前找到的的0的坐标进行搜原创 2020-12-20 20:45:13 · 196 阅读 · 0 评论 -
stl_algo_图解lower_bound & upper_bound算法及LeetCode例题
stl_algo_图解lower_bound & upper_bound算法1.1、lower_bound的作用 lower_bound就是二分查找的一种左边界版本,他返回一个迭代器。在排序好的[first, last)区间中寻找value,如果找到这些元素(可能有多个重复的),就返回指向第一个元素的迭代器;如果没找到,那么就返回指向该value的值在不破坏排序条件下应该在的位置的迭代器,例子如下:lb1 = lower_bound(first, last, 2);lb2 = lower_原创 2020-11-24 19:54:52 · 245 阅读 · 0 评论 -
memstr、strcpy、memcpy的C语言实现
1、memstr的实现实现代码:/** * @brief 在字符串full_data中查找字符串substr第一次出现的位置 * * @param full_data 源字符串首地址 * @param full_data_len 源字符串长度 * @param substr 匹配字符串首地址 * * @returns * 成功: 匹配字符串首地址 * 失败:NULL */ char* memstr(char* full_data, i原创 2020-10-28 19:48:43 · 1129 阅读 · 0 评论 -
链表排序_使用归并实现LeetCode排序链表
链表排序_使用归并排序链表1、题目描述 在 O(nlogn) 时间复杂度和常数级空间复杂度下,对链表进行排序。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */示例 1:输入: 4->2->1->3输出: 1-&原创 2020-10-12 20:06:22 · 272 阅读 · 0 评论 -
图解旋转数组_Go实现C++ STL中的随机迭代器版本的rotate算法
旋转数组_Go实现C++ STL中的随机迭代器版本的rotate算法一、旋转数组(向左)的实现方法一 先上图:显然这个方式就是通过3遍reverse来实现旋转数组,这个方法比较简单,不是本文讨论的重点。二、Go实现的STL中的随机迭代器版本的rotate算法//辗转相除法求最大公约数func Gcd(a int ,b int) int{ max := Max(a,b) min := Min(a,b) for min!=0 { t := max % mi原创 2020-09-20 21:28:18 · 234 阅读 · 0 评论 -
二叉树_使用递归和迭代实现LeetCode二叉树重建
二叉树_使用递归和迭代实现LeetCode二叉树重建题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7限制:0 <= 节点个数 <= 5000题目链接,来源:力扣一、递归法1、思路原创 2020-09-17 14:45:10 · 326 阅读 · 0 评论 -
动态规划_从爬楼梯、零钱兑换II、分割等和子集来看背包问题
动态规划_从爬楼梯、零钱兑换II、分割等和子集来看背包问题一、爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。**示例 1:**输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶**示例 2:**输入: 3输出: 3解释: 有三种方法可以爬到楼顶。4. 1 阶 + 1 阶 + 1 阶5. 1 阶 + 2 阶6. 2 阶原创 2020-06-30 14:47:05 · 258 阅读 · 0 评论 -
二分查找_求解sqrt问题
二分查找_求解sqrt的基本问题1 实现 int sqrt(int x) 函数计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。题目链接:x的平方根二分查找的方法就是利用计算机不断的比对midmid是否等于x,如果小于x那么就让left = mid+1,增大下一次计算的mid,原创 2020-06-21 11:57:42 · 970 阅读 · 0 评论 -
算法基础_LeetCode两数之和、三数之和、四数之和、最接近的三数之和解析对比(Cpp)
算法基础_LeetCode两数之和与三数之和的解析对比1 两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]来源:力扣(LeetCode)链接:https://leetc原创 2020-06-21 10:24:44 · 322 阅读 · 0 评论 -
二分查找_LeetCode找到K个最接近的元素
二分查找_LeetCode找到K个最接近的元素 给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。示例 1:输入: [1,2,3,4,5], k=4, x=3输出: [1,2,3,4] 示例 2:输入: [1,2,3,4,5], k=4, x=-1输出: [1,2,3,4] 说明:k 的值为正数,且总是小于给定排原创 2020-05-27 10:33:57 · 316 阅读 · 0 评论 -
二叉树基础_LeetCode二叉树前序、中序、后序、层序非递归遍历的简便方法
二叉树_前序、中序、后序、层序非递归遍历的简便方法1 二叉树的前序遍历 任何二叉树都可以看成只有三个节点的树,如下图。例如先序遍历的时候需要先输出根节点,那么就把根节点的val输出到vec,然后把根节点入栈,入栈的目的是为了利用这个节点后面去访问它的右子树。 当进入左子树后,也可以把左子树理解为一颗新的二叉树,继续重复前面的步骤,直到到达叶子节点,此时p = p->next导致p指向NULL,那么需要利用栈顶元素去访问当前根节点的右子树,利用了栈顶元素后需要原创 2020-05-25 10:27:37 · 140 阅读 · 0 评论 -
二分查找_LeetCode搜索旋转排序数组
二分查找_LeetCode搜索旋转排序数组假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], target = 0输出: 4示原创 2020-05-22 20:44:28 · 190 阅读 · 0 评论 -
链表基础_图文详解LeetCode反转链表I 和 II的迭代解法(C++)
算法基础_LeetCode反转链表I 和 II的迭代解法反转链表 I反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-linked-list下面来看看迭代解法:/** * Defini原创 2020-05-19 15:42:35 · 199 阅读 · 0 评论 -
C++习题_字符串中寻找单词的C++实现
//在给定字符串中找出单词(“单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,//如空格、问号、数字等等,另外单个字母不算单词)。//找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中。//如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,请输出空串。//输出的单词之间使用一个“空格”隔开...原创 2020-03-30 22:24:40 · 2904 阅读 · 1 评论 -
递归算法_C++实现全排列(按字典序)的图文详解
递归实现全排列(字典序)题目要求:使用递归算法实现按照字典序输出1~n的全排列。关于全排列以及字典序是什么的讲解网上很多,这里就不赘述。这道题目实质上是考察对于递归的理解。这个问题可以被划分成多个子问题,假如是1~3的全排列,那么有1作为第一位,2作为第一位,3作为第一位的子问题。在1作为第一位的情况下,又有2作为第二位和3作为第二位的子问题。这些问题的解决方式都很类似,所以可以用递归解...原创 2020-03-04 23:12:06 · 4035 阅读 · 0 评论 -
算法基础_线性表的C++实现
算法基础_线性表线性表也称为有序表,他的每一个实例都是元素的一个有序集合。每个实例的形式为(a0, a1, a2, …a(n-1)),其中n是有穷自然数,ai是线性表的元素,i是ai的索引,n是线性表的长度或者大小。线性表的操作1.创建一个线性表。2.撤销一个线性表。3.确定线性表是否为空。4.确定线性表的长度。5.按一个给定的索引查找一个元素。6.按一个给定的元素查找其索引。7...原创 2020-03-04 10:33:59 · 1344 阅读 · 0 评论 -
位操作_利用二进制的位操作实现整数加减乘除的代码实现
#include <iostream>using namespace std;//二进制实现加法int add(int num1, int num2){ int sum = num1 ^ num2;//等于不进位相加 int carry = (num1 & num2) << 1; //等于只进位 while (carry != ...原创 2020-02-19 17:57:18 · 425 阅读 · 0 评论 -
算法思维__two pointers
算法基础之排序(一) 快速排序原创 2020-02-18 14:42:07 · 265 阅读 · 0 评论 -
算法基础__性能分析
算法基础__程序性能分析什么是程序性能?通常来说,程序性能就是指运行这个程序所需要的的内存和时间的多少。分析程序的性能有两种方法,一种是数学分析、另一种是实际测量。所谓一个程序的空间复杂度是指该程序运行所需内存的大小,所谓程序的时间复杂度是指程序运行所需要的时间。空间复杂度空间复杂度的组成:1.指令空间,是编译之后的程序指令所需要的的存储空间。影响指令空间的因素:(1)编译器(...原创 2020-02-16 17:44:40 · 257 阅读 · 0 评论