
数据结构
文章平均质量分 89
JMW1407
这个作者很懒,什么都没留下…
展开
-
Java:数据结构笔记之LRU缓存机制的简单理解和使用
Java LRU缓存机制的简单理解和使用LRU缓存机制1、题目2、思路3、题解LRU缓存机制1、题目原题链接运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。写入数据 put(key, value) -如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字/值」。当缓存容原创 2022-01-20 09:00:45 · 770 阅读 · 0 评论 -
跳跃表(skiplist )详解及其C++编程实现
跳表SkipList跳表SkipList1、背景2、定义2.1、SkipList基本数据结构及其实现3、实现4、使用方法4.1、跳表的创建4.2、跳表插入操作参考跳表SkipList1、背景为什么选择跳表?目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。跳表是平衡树的一种替代的数据结构,但是和红黑树不相同的是,跳表对于树的平衡的实现是基于一种随机化的算法的,这样也就是说跳表的插入和删除的工作是比较简单的。用跳表吧,跳表是一种随机化的数据结构,目前开源软件原创 2020-11-18 11:14:39 · 3351 阅读 · 4 评论 -
LeetCode分类刷题:二叉树(Tree)——(二叉树之前序、中序、后序、层次遍历、深度相关、侧视图相关)
二叉树 Tree 二叉树(Tree)1、定义2、二叉树之前序、中序、后序遍历3、二叉树之层遍历4、二叉树之深度相关5、二叉树之侧视图相关6、二叉树之递归应用参考二叉树(Tree)1、定义树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决,当然有些题目非递归解法也应该掌握,如非递归遍历节点等原创 2020-10-01 08:40:33 · 445 阅读 · 0 评论 -
C++三数之和——无序数组中找出和为0(leetcode15)的三元组以及最接近的三数之和(leetcode16)
C++实现生产者和消费者模型 C++实现生产者和消费者模型C++实现生产者和消费者模型class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> result; int length = nums.size(); if(length < 3)原创 2020-09-30 08:10:52 · 1610 阅读 · 1 评论 -
C++实现字符串匹配——KMP算法:
KMP算法 KMP算法KMP算法#include <iostream>#include <vector>#include <string>using namespace std;int ViolentMatch(string& s, string& p){ int sLen = s.size(); int pLen = p.size(); int i = 0; int j = 0; while (i < sLen &am转载 2020-09-28 08:33:21 · 3321 阅读 · 2 评论 -
一个数组中的元素所有的元素都出现三次,只有一个元素只出现了一次,找出这个元素
一个数组中的元素所有的元素都出现三次,只有一个元素只出现了一次,找出这个元素 题目题目给定一个数组,除了一个数出现1次之外,其余数都出现3次。找出出现一次的数。如:{1, 2, 1, 2, 1, 2,7},找出7.格式:第一行输入一个数n,代表数组的长度,接下来一行输入数组A[n],(输入的数组必须满足问题描述的要求),最后输出只出现一次的数。数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次。请给出最快的方法找到x。应该如何思考呢?如果是两个相同的就可以利用两个相同的数异或结原创 2020-09-27 08:31:19 · 2404 阅读 · 2 评论 -
最短路径问题 --- Dijkstra算法详解
最短路径问题 最短路径问题1、最短路径问题介绍2、Dijkstra 算法思路3、Dijkstra算法示例演示4、Dijkstra算法的代码实现(c++)参考最短路径问题1、最短路径问题介绍从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径1,给定一个带权有向图 G 与起始顶点 v,求从 v 到 G 中其它顶点的最短路径(每条边上都存在有意义的权值);2,Dijkstra 算法核心是通过已知最短路径寻找未知最短路径;2、Dijkstra 算法思路算法特原创 2020-09-25 08:18:32 · 6911 阅读 · 3 评论 -
C++实现图的深度优先遍历和广度优先遍历
图的深度优先遍历 图的深度优先遍历参考图的深度优先遍历参考1、https://blog.youkuaiyun.com/todd911/article/details/91914812、https://blog.youkuaiyun.com/weixin_42109012/article/details/94199335原创 2020-09-24 08:25:04 · 10845 阅读 · 0 评论 -
c++实现岛问题
岛问题1. 问题描述2、题解1. 问题描述一个矩阵中只有0和1两种值,每个位置都可以和自己的上、下、左、右四个位置相连,如果有一片1连在一起,这个部分叫做一个岛,求一个矩阵中有多少个岛?比如:0 0 1 0 1 01 1 1 0 1 01 0 0 1 0 00 0 0 0 0 0这个矩阵中有三个岛。2、题解思路我们的主体是进行二维数组的遍历,同时我们也定义一个感染函数。比如我们遇到一个1时候,我们对这个点的上下作用进行感染,让其赋值为2,所以会导致一片为1的点都会被感染为2,只原创 2020-09-23 08:37:59 · 340 阅读 · 0 评论 -
C++递归实现栈逆序
递归实现栈逆序递归实现栈逆序递归实现栈逆序思路:使用递归函数保存栈中变量。递归函数分两个,一个获取并移除栈底元素,另一个负责逆序。其实俩个递归思路基本一致。获取并移除栈底元素的递归结构图如下:...原创 2020-09-22 08:30:01 · 2057 阅读 · 1 评论 -
C++ 打印菱形(实心和空心)
打印菱形 打印菱形1、打印实心菱形2、打印空心菱形打印菱形1、打印实心菱形#include<iostream>using namespace std;int main(){ cout << "Please enter the side length of the diamond:"; int n; cin >> n; for (int i = 0; i<n; i++) // 分为上半层打印和下半层打印,首先打原创 2020-09-19 07:57:28 · 21706 阅读 · 4 评论 -
C++实现生产者和消费者模型
C++实现生产者和消费者模型 C++实现生产者和消费者模型1、实现细节1、单生产者-单消费者模型参考C++实现生产者和消费者模型1、实现细节具体的实现逻辑是构建一个queue来存储生产的数据,queue不满时可以生产,不空时可以消费。对于这个队列,采用阻塞队列的实现思路。先实现构造函数,初始化一个unique_lock供condition_variable使用。如何在类里面使用unique_lock等需要初始化,并且初始化会加锁的对象。这要研究下。我的理解是构造列表初始化,然后函数体里unl原创 2020-09-17 08:50:04 · 18657 阅读 · 10 评论 -
C++矩阵的不同打印方式(转圈打印矩阵、方形矩阵顺时针旋转90度、“之”字形打印矩阵)
矩阵的不同打印方式矩阵的不同打印方式1、转圈打印矩阵2、方形矩阵顺时针旋转90度3、“之”字形打印矩阵矩阵的不同打印方式1、转圈打印矩阵【题目】 给定一个整型矩阵matrix,请按照转圈的方式打印它。例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 1415 16 打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11, 10【要求】 额外空间复杂度为O(1)。1 2 3 45 6 7 89 10 11 1213 14 1原创 2020-09-16 08:02:22 · 1701 阅读 · 0 评论 -
C++买卖股票的最佳时机(股票买卖大合集)
股票买卖最佳时机股票买卖最佳时机1、买卖股票的最佳时机题目2、穷举框架3、状态转移框架4、 k = 15、 k = 2股票买卖最佳时机1、买卖股票的最佳时机题目原题链接给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股原创 2020-09-15 08:20:36 · 899 阅读 · 0 评论 -
C++代码实现Top-K问题最优解决办法
Top-K问题Top-K问题1、问题描述2、解法思想和实现Top-K问题1、问题描述Top-K问题是一个十分经典的问题,一般有以下两种方式来描述问题:在10亿的数字里,找出其中最大的100个数;或者在一个包含n个整数的数组中,找出最大的100个数。前边两种问题描述稍有区别,但都是说的Top-K问题,前一种描述方式是说这里也许没有足够的空间存储大量的数字或其他东西,我们最好可以在一边输入数据,一边求出结果,而不需要存储数据;后一种说法则表示可以存储数据,这种情况下,最简单直观的想法就是对数组进行排序,原创 2020-09-14 08:09:38 · 2169 阅读 · 1 评论 -
排序算法——O(n^2)(冒泡排序、选择排序、插入排序)
冒泡排序、选择排序、插入排序冒泡排序、选择排序、插入排序1、冒泡排序(BubbleSort)2、选择排序(SelectionSort)3、插入排序(InsertionSort)冒泡排序、选择排序、插入排序1、冒泡排序(BubbleSort)冒泡排序算法的运作如下:1、比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大(小)的数。3、针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序原创 2020-09-13 08:11:24 · 272 阅读 · 0 评论 -
什么是状态机(Finite-state machine)?
有限状态机有限状态机(FSM)1、 什么是“状态”2、什么是状态机?3、状态机图怎么画?参考有限状态机(FSM)1、 什么是“状态”先来解释什么是“状态”( State )。现实事物是有不同状态的,例如一个自动门,就有 open 和 closed 两种状态。我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限个,例如自动门的状态就是两个 open 和 closed 。状态机,也就是 State Machine ,不是指一台实际机器,而是指一个数学模型。说白了,一般就是指一张状态转换原创 2020-09-12 08:10:30 · 60924 阅读 · 5 评论 -
常见数据结构——海量数据处理之布隆过滤器(Bloom Filter)详解
https://blog.youkuaiyun.com/v_july_v/article/details/6685894原创 2020-09-05 09:52:00 · 654 阅读 · 0 评论 -
C++海量数据处理——判读40亿数字中是否有某个数字(位图BitMap)
判读40亿数字中是否有某个数字(位图BitMap)判读40亿数字中是否有某个数字(位图BitMap)参考判读40亿数字中是否有某个数字(位图BitMap)例:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。需求分析:Int类型在Java中的存储占用4个Byte,32Bit,如果在内存中定义40亿个int类型数组来读取文件,占用大小:(40*100000000*4/1024/1024/1024)G=14.901G。这已经远远超出了机器的内存限制,这时候常原创 2020-09-03 11:05:35 · 1631 阅读 · 0 评论 -
常见数据结构——完全二叉树(定义、特征、节点个数的判断以及C++简单实现)
1、https://blog.youkuaiyun.com/troubleshooter/article/details/7706772?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159825431419195239741199%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159825431419195239741199&biz_id原创 2020-09-02 08:28:07 · 93533 阅读 · 12 评论 -
高度为n的平衡二叉树最少需要多少个节点?
高度为n的平衡二叉树最少需要多少个节点?高度为n的平衡二叉树最少需要多少个节点?参考高度为n的平衡二叉树最少需要多少个节点?设f(n)为高度为n的平衡二叉树最少含有的节点数,则:f(1) = 1;f(2) = 2; f(3) = 4;f(4) = 7;……这些可以通过画图就能得到,但是当n很大时呢?其实有如下结论:f(n) = f(n-1) + f(n-2) +1,(n>=3)。这个递推结论如何得到的呢?引导问题:求一棵二叉树的节点数目:假设一颗二叉树T,其左右子树分别为TL,TR。又假设T原创 2020-09-01 07:47:31 · 11603 阅读 · 0 评论 -
数据结构常见排序算法——快速排序(定义、特征、递归和非递归实现、优化、快速排序 Vs. 归并排序 Vs. 堆排序)
快速排序快速排序1、定义2、特征3、实现过程4、C++代码5、优化5、快速排序 Vs. 归并排序 Vs. 堆排序参考快速排序1、定义快速排序的基本思想是,通过一轮的排序将序列分割成独立的两部分,其中一部分序列的关键字(这里主要用值来表示)均比另一部分关键字小。继续对长度较短的序列进行同样的分割,最后到达整体有序。在排序过程中,由于已经分开的两部分的元素不需要进行比较,故减少了比较次数,降低了排序时间。总结:1、先从数列中取出一个数作为基准数2、分区过程,将比这个数大的数全放到它的右边,小原创 2020-08-30 08:47:26 · 863 阅读 · 0 评论 -
剑指offer 关于链表的例题 —— 链表的环的入口结点、倒数第k个结点、两个链表的第一个公共结点、反转链表、合并两个排序的链表、删除排序链表中的重复元素
递增数组中查找目标值递增数组中查找目标值(双指针or二分查找)1、子序列1.1、最长上升子序列1.1.1、思路1.1.2、题解1.2、最长公共子序列递增数组中查找目标值(双指针or二分查找)1、子序列1.1、最长上升子序列1.1.1、思路1.1.2、题解1.2、最长公共子序列...原创 2020-08-20 11:18:06 · 178 阅读 · 0 评论 -
leetcode416、322、518—— 0-1背包问题(笔试热点)、完全背包
背包问题背包问题1、0-1背包问题1.1、标准0-1背包1.1.1、思路1.1.2、题解1.2、分割等和子集1.2.1、思路1.2.2、题解2、完全背包问题2.1、零钱兑换12.1.2、思路2.1.3、题解2.2、零钱兑换22.2.2、思路2.2.3、题解参考背包问题1、0-1背包问题1.1、标准0-1背包背包问题是什么给你一个可装载重量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第i个物品的重量为wt[i],价值为val[i],现在让你用这个背包装物品,最多能装的价值是多少?N =原创 2020-08-15 18:26:32 · 723 阅读 · 0 评论 -
leetcode34、704、剑指offer 57 —— 在递增数组中查找目标值的问题(双指针法)
递增数组中查找目标值递增数组中查找目标值(双指针or二分查找)1、二分查找1.1、二分查找1.1.1、思路1.1.2、题解1.2、寻找左侧边界1.3、寻找右侧边界1.3、在排序数组中查找元素的第一个和最后一个位置1.3.1、题解2、和为S的连续正数序列2.1、题解3、和为s的两个数字3.1、题解递增数组中查找目标值(双指针or二分查找)1、二分查找1.1、二分查找原题链接给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 targe原创 2020-08-14 10:34:22 · 391 阅读 · 0 评论 -
leetcode53、300、1143—— 子序列和子数组问题(动态规划)
子序列和子数组子序列和子数组1、子序列1.1、最长上升子序列1.1.1、思路1.1.2、题解1.2、最长公共子序列1.2.1、思路1.2.2、题解2、子数组2.1、连续子数组的最大和2.2、思路2.3、题解参考子序列和子数组1、子序列1.1、最长上升子序列题目链接给定一个无序的整数数组,找到其中最长上升子序列的长度。输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,原创 2020-08-11 21:46:08 · 506 阅读 · 1 评论 -
leetcode 热点——排列组合问题
排列组合问题排列组合问题1、子集问题1.1、求数字的所有子集。1.2、思路1.3、题解2、组合2.1、无重复字符串的排列组合2.2、思路2.3、题解3、排列问题3.1、求算法输出这些数字的所有子集。3.2、思路3.3、题解参考排列组合问题1、子集问题1.1、求数字的所有子集。题目链接添加链接描述给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。输入: nums = [1,2,3]输出:[ [3], [1], [2],原创 2020-08-10 22:10:23 · 1413 阅读 · 0 评论 -
leetcode 26、剑指offer(调整数组顺序,使奇数位于偶数之前)—— 排头兵思想(个人理解,仅供参考)
排头兵问题排头兵(又有双指针思想的味道在里面)题目1、leetcode 261.1、思路1.2、题解2、调整数组顺序,使奇数位于偶数之前2.2、题解排头兵(又有双指针思想的味道在里面)题目1、leetcode 26原题链接给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2], 函数应该返回新的长原创 2020-08-06 11:21:40 · 152 阅读 · 0 评论 -
leetcode3、76、438、567、剑指offer滑动窗口最大值—— 滑动窗口问题
滑动窗口问题滑动窗口1、滑动窗口3问题2、题目2.1、滑动窗口最大值(最纯粹的窗口算法)2.1.1、思路2.1.2、题解2.2、leetcode76、最小覆盖子串(往下都是基于滑动窗口思想)2.2.1、思路2.2.2、题解2.3、leetcode 762.3.1、思路2.3.2、题解2.4、leetcode 4382.4.1、思路2.4.2、题解2.5、leetcode 5672.5.1、思路2.5.2、题解参考滑动窗口1、滑动窗口3问题- 1、如何向窗口中添加新元素?- 2、如何缩小窗口,也就是转载 2020-08-05 23:10:53 · 288 阅读 · 0 评论 -
leetcode 448、645 —— 找到所有数组中消失的数字(错误的集合)
数组中消失和重复的数字数组中消失和重复的数字1、题目2、思路3、题解4、错误的集合(leetcode545,解法和448一样)数组中消失和重复的数字1、题目448. 找到所有数组中消失的数字给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。输入:[4,原创 2020-08-02 16:43:03 · 281 阅读 · 0 评论 -
leetcode20、22——有效括号问题(判断有效的括号以及生成有效的括号)
有效括号1、判断有效的括号1.1、题目1.2、思路1.3、题解2、生成有效的括号2.1、题目2.2、思路2.3、题解参考1、判断有效的括号1.1、题目题目链接给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。输入: "()"输出: true输入: "()[]{}"输出: true输入: "(]"输出: false原创 2020-08-01 16:38:34 · 3450 阅读 · 0 评论 -
leetcode 42 ——接雨水问题
接雨水接雨水1、题目2、思路3、题解3.1、暴力解法3.2、空间换时间(备忘录优化)3.3、双指针解法参考接雨水注意和盛最多水的容器区别。盛最多水的容器接雨水1、题目原题链接给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 62原创 2020-07-31 11:37:02 · 553 阅读 · 0 评论 -
leetcode 986 、56 ——区间问题(数组区间的并集和交集)
前缀和技巧区间问题1、区间的交集1.1、题目1.2、思路1.3、题解2、区间的并集2.1、题目2.2、思路2.3、题解区间问题1、区间的交集1.1、题目原题链接给定两个由一些 闭区间 组成的列表,每个区间列表都是成对不相交的,并且已经排序。返回这两个区间列表的交集。(形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合,而 a <= x<= b。两个闭区间的交集是一组实数,要么为空集,要么为闭区间。例如,[1, 3] 和 [2, 4] 的交集为 [2, 3]原创 2020-07-30 09:59:52 · 3622 阅读 · 0 评论 -
leetcode 523、560—— 前缀和技巧
前缀和技巧前缀和1、定义2、题解:LeetCode560. 和为K的子数组方法一:穷举所有子数组,计算子数组的和优化解法前缀和1、定义前缀和的思路是这样的,对于一个给定的数组 nums,我们额外开辟一个前缀和数组进行预处理。int n = nums.size();// 前缀和数组vector<int>preSum(n + 1);for (int i = 0; i < n; i++) preSum[i + 1] = preSum[i] + nums[i];preS原创 2020-07-29 10:05:11 · 405 阅读 · 0 评论 -
leetcode 146——C++简单实现LRU缓存机制
LRU缓存机制LRU缓存机制1、题目2、思路3、题解LRU缓存机制1、题目运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。写入数据 put(key, value) -如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字/值」。当缓存容量达到上限时,它应该在写入新数据之前原创 2020-07-25 12:57:50 · 1731 阅读 · 1 评论 -
leetcode 11——盛最多水的容器(双指针解法)
盛最多水的容器盛最多水的容器1、题目2、思路(双指针解法)3、题解参考盛最多水的容器1、题目题目链接给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分原创 2020-07-24 11:35:10 · 457 阅读 · 0 评论 -
后端面试常见数据结构1——前缀树(Prefix Tree)
前缀树(Prefix Tree)1、背景2、定义3、特点4、构造4.1、实现 Trie (前缀树)——力扣 2084.2、Trie ——文本词频统计参考1、背景节点所有的后代都与该节点相关的字符串有着共同的前缀。这就是前缀树名称的由来。对于一个字符串数据,我们要从查找某个字符串是否出现过,或者其中以“hell”开头 ,或者以"ive"结尾的字符是否出现以及出现的个数等等操作。我们只需要在定义前缀树的时候加上相应得数据项就可以了。2、定义前缀树是N叉树的一种特殊形式。通常来说,一个前缀树是用来原创 2020-06-25 12:55:45 · 1085 阅读 · 0 评论