![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 63
梦否
【@】bug修复,程序代做
展开
-
【LeetCode】最小K个数
旨在复习堆排序和快排算法。题目地址:最小K个数1. 题目描述设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。示例:输入: arr = [1,3,5,7,2,4,6,8], k = 4输出: [1,2,3,4]提示:0 <= len(arr) <= 1000000 <= k <= min(100000, len(arr))来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/smallest原创 2021-09-03 09:53:03 · 104 阅读 · 0 评论 -
【LeetCode】数组中的最长连续子序列
本题地址:128. 最长连续序列1. 题目描述给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-consecutive-sequence2. 解答2.1 朴素解法如果我们不考虑要求时间复杂度为 O(n),那么我们可以采用最直观的方式来做这个题。比如:先将数组排序;原创 2021-09-02 15:36:48 · 5500 阅读 · 3 评论 -
Base64编码原理
这里仅修复原文中的图示,其余内容不做修改。这篇文章对Base64编码原理讲解的很好,原文链接:https://hello.blog.csdn.net/article/details/817347701. Base64的由来 目前Base64已经成为网络上常见的传输8bit字节代码的编码方式之一。在做支付系统时,系统之间的报文交互都需要使用Base64对明文进行转码,然后再进行签名或加密,之后再进行(或再次Base64)传输。那么,Base64到底起到什么作用呢? 在参数传输的过程中经常遇转载 2021-09-01 17:16:16 · 133 阅读 · 0 评论 -
【差分数组】1109. 航班预订统计
1. 题目描述这里有 n 个航班,它们分别从 1 到 n 进行编号。有一份航班预订表 bookings ,表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti (包含 firsti 和 lasti )的 每个航班 上预订了 seatsi 个座位。请你返回一个长度为 n 的数组 answer,其中 answer[i] 是航班 i 上预订的座位总数。示例 1:输入:bookings = [[1,2,10],[2,原创 2021-08-31 10:48:25 · 148 阅读 · 0 评论 -
不用for循环找最大值
1. 使用Jdk1.8中的流private static int getMax(int[] arr){ return Arrays.stream(arr).max().getAsInt();}2. 使用递归来代替for/** * 递归的从后往前找最大值,最大值记录在lastVal变量中 * @param arr 待求数组 * @param lastIndex 数组最后一个下标 * @param lastVal 数组最后一个元素 * @return */private stat原创 2021-08-29 20:11:04 · 510 阅读 · 0 评论 -
多线程的LRU缓存
在之前的这篇LRU缓存Java实现中介绍了LRU缓存的简单实现。今天尝试来继续深入点。首先我们抽象接口,我的文件结构如下:为了面向非单一的固定类型,这里使用泛型来定义:public interface Cache<K, V> { V get(K key); void set(K key, V value); int size();}1. 单线程LUR缓存在单线程LUR缓存的设计中,保持和上篇的一致,即还是使用HashMap+双向链表来实现。另外为了测试比较原创 2021-08-26 11:50:14 · 769 阅读 · 0 评论 -
快速排序的一些优化
教科书上的快排算法:public void quickSort(int[] arr){ quicksort(arr, 0, arr.length - 1);}private void quicksort(int[] arr, int left, int right) { if(left < right){ int par = partition(arr, left, right); quicksort(arr, left, par - 1);原创 2021-08-25 18:27:38 · 76 阅读 · 0 评论 -
递归的粗浅理解
前言:最近在leetcode上刷题,发现很多涉及数的操作的问题,无一例外都需要使用到函数的递归调用。然后自己也试着写了一些简单的函数来理解栈的使用。 关于递归的理解: 函数递归调用,使用到栈。而栈退出的条件是: 在调用的过程中,无压栈再次进行,就开始退栈。 需要注意的是:在递归函数中自定义的局部变量,在每次调用的过程中都会创建一个新的副本,所以...原创 2018-08-28 15:47:46 · 212 阅读 · 0 评论 -
找出序列中K最小值的下标
最简单的做法就是定义一个下标数组,然后同时排序原来的值数组和新的下标数组即可。而这里就使用最简单的冒泡排序即可。如下:def get_k_most_min_index(_list, k): # 下标数组 _index = list(range(len(_list))) # 直接排序即可 for i in range(len(_list)): for j in range(i+1, len(_list)): if _list[i] &原创 2020-12-30 20:47:34 · 253 阅读 · 0 评论 -
无向无权图最短路径问题
题目要求:计算节点之间最短路径的最大值、中位值和平均值;其实解决这个问题的思路有很多,像什么单源最短路径…很多的算法可以解决这个问题。因为我这里在求最短路径的时候,将图简化成了无权值图,故而可以思考用更加简单的方式来解决这个问题,对于这个思路,我截了张PPT图,如下:也就是在广度优先搜索的时候,我们存储以源节点开始的这颗逻辑树的所有的父子关系,然后根据这个父子关系,我们可以从子搜索父,从...原创 2020-03-12 09:34:09 · 3535 阅读 · 0 评论 -
给出两个整数 a 和 b , 求他们的和。
class Solution(object): def summation(self, a, b): """ :type nums: List[int] :rtype: int """ # 对 a b 两个数字,做异或运算求不含进位的结果,做与运算在左移一位求进位的结果,最后将两者位用异或运算合在一起, ...原创 2019-10-31 12:14:39 · 2872 阅读 · 1 评论 -
C++ 后缀表达式转为中缀表达式,并计算结果
2、输入表达式,输出值。分两种情况:中缀表达式和后缀表达式。中缀表达式求值:先将中缀表达式建立二叉树转后缀表达式,然后再求值。尝试1:#include <iostream>#include <string>#include <cmath>#include <cstdlib>//sum1=atof(t1.c_str());usin...原创 2019-03-13 11:55:54 · 3122 阅读 · 0 评论 -
求最大公约数 图解
原创 2019-03-14 12:35:00 · 2245 阅读 · 0 评论 -
八皇后问题
目录问题分析过程模拟问题回答八皇后问题非递归实现八皇后问题递归方式问题分析八皇后问题:高斯于1850年提出的问题。 在8*8的棋盘上放置八个皇后,任意两个皇后都不能处于同一行、列或者同一斜线上。 分析: 首先要解决的两个问题: 1. 如何表示棋盘?...原创 2018-11-17 13:14:48 · 3899 阅读 · 10 评论 -
二叉树的后序遍历-递归和非递归算法
同样的,创建的算法在先序中有,略去。后序递归遍历算法void PostOrder(BiTree bt){ if(bt){ PostOrder(bt->lchild); PostOrder(bt->rchild); cout<<bt->data<<" "; }}后序非递归算法思想: 先序序列: 1 、2 、3...原创 2018-11-16 15:14:49 · 17074 阅读 · 6 评论 -
二叉树的中序遍历-递归和非递归算法
创建二叉树就不说了,这里直接:中序递归遍历算法void InOrder(BiTree T){ if(T){ InOrder(T->lchild); cout<<T->data<<" "; InOrder(T->rchild); }}中序非递归遍历算法void InOrder(BiTree T){ //还是模拟上面的遍历...原创 2018-11-16 14:11:23 · 9900 阅读 · 1 评论 -
二叉树的先序遍历-递归和非递归算法
需要实践先序遍历,我们先建立二叉树。这里采用先序序列建立二叉树,不为别的,因为简单。typedef int ElemType;typedef struct BiTNode{ ElemType data; struct BiTNode *lchild, *rchild;}*BiTree, BiTNode;void CreateBiTreePreOrder(BiTree &T...原创 2018-11-16 13:55:04 · 54489 阅读 · 12 评论 -
题目17 判断B是否是A的连续子列
题目17:判断B是否是A的连续子列这里题目的复杂性在于: 链表不一定是有序排列的,其子列完全可以是无序状态下的子列。 思想:首个元素开始两两比较,如果不等,B回退到首个元素,A回退到第二个元素,依次进行下去…… 直到B的链尾,表示匹配成功。不难发现,类似于字符串的简单匹配算法。bool subSequence(Node *a, Node *b){ //b∈a a =...原创 2018-10-21 18:14:28 · 842 阅读 · 0 评论 -
题目14 归并链表,递减排列。两链表递增排列,要求利用原来节点存放归并后的单链表
题目14:归并链表,递减排列。两链表递增排列,要求利用原来节点存放归并后的单链表void merge_ByDesc(Node *&a, Node *&b, Node *&n){ //新链表递减排列,故可以采用头插法-假设均带头节点 Node *p=a->next, *q=b->next, *r, *m; r=n=a; r->next =...原创 2018-10-21 18:04:42 · 813 阅读 · 0 评论 -
数据结构中涉及的排序算法
下面按照课本的分类,做了大致的内排序的归类的图片:下面我们逐个来实现排序的算法:一、插入排序算法:包括:直接插入、折半插入、和希尔排序其中,插入排序的思想都是一样的,都是以首个待排序的数字作为假设已经有序的序列,然后从已经有序的序列的最后一个位置,从后往前找满这趟比较中元素适合放置的位置。1. 直接插入插入排序:/*直接插入插入排序,假定首个元素有序, 待插...原创 2018-08-28 22:16:19 · 2365 阅读 · 0 评论 -
顺序表中的三种删除重复元素的思想
删除顺序表中的相同元素的三种思想,下面归纳为三个名称,以方便记忆:定位赋值法、判断回退法、双端判别交换法图解如下: 完整de代码如下:#include<iostream>using namespace std;typedef int ElemType;typedef struct Sqlist{ ElemType *data; int...原创 2018-10-01 21:39:41 · 10833 阅读 · 1 评论 -
递归调用:链表中删除元素不断链现象
删除的代码:void del(NodeList &L, ElemType x){ NodeList p; if(L!=NULL) if(L->data==x){ p = L; L=L->next; free(p); cout<<L&l...原创 2018-10-01 21:54:01 · 1111 阅读 · 0 评论 -
链表相关的试题连载
链表相关的试题连载说明这是在复习考研数据结构时候的试题的编写和整理。包含王道和天勤。主要是对编程题的练习,不涉及填空题等。这里首先给出的是链表的定义相关的自定义头文件: - 数据结构格式:lianbiao.h 在编写的cpp文件中,#include “lianbiao.h”中引入就可以了。#ifndef CRYU_H //如果没有定义CRYU_H#define CRYU_H /...原创 2018-10-20 21:59:25 · 226 阅读 · 0 评论 -
第一题 单链表的逆序
单链表的逆序 方法一:头插法void Reverse(Node*& n){ //头插法-带头结点 Node *p,*q; p = n->next; n->next = NULL; while(p!=NULL){ q = p->next; p->next = n->next; n->next = p; p = q;...原创 2018-10-20 22:11:23 · 192 阅读 · 0 评论 -
题目2 单链表排序
单链表排序void sort(Node*& n){ Node *p, *q, *pre; p = n->next->next; n->next->next = NULL; while(p!=NULL){ q = p->next; //保存下一个节点 pre = n; while(pre->next!=NULL and pre...原创 2018-10-20 22:15:51 · 194 阅读 · 0 评论 -
题目3 删除无序链表中,介于两值之间的节点
删除无序链表中,介于两值之间的节点 void del_between(Node*& n, int a, int b){ //带头节点 Node *p, *q, *pre; pre=n; p=n->next; while(p!=NULL){ if(p->num>=a and p->num<=b){ q = p; p = p-&...原创 2018-10-20 22:18:21 · 231 阅读 · 0 评论 -
题目4 递增链表,去除重复元素
递增链表,去除重复元素 void distinct_1(Node*& n){ Node *p, *q, *pre; p=n->next; pre = n; while(p!=NULL){ while(p->next!=NULL and p->next->num==p->num){ q=p; p=p->next; f...原创 2018-10-20 22:21:38 · 200 阅读 · 0 评论 -
题目5 删除不带头节点中所有值为X的节点
删除不带头节点中所有值为X的节点 //栈删除 void del_all(Node *& n, int x){ //不带头结点的链表 Node * p; if(n!=NULL){ if(n->num==x){ p = n; n = n->next; free(p); del_all(n, x); }else{ del_all...原创 2018-10-20 22:24:42 · 177 阅读 · 0 评论 -
题目6 单链表,按序奇偶拆成AB两个链表
单链表,按序奇偶拆成AB两个链表 void pull_two(Node*& n, Node *& A, Node *& B){ //带头节点 A = (Node*)malloc(sizeof(Node)); Node *ap = A; B = (Node*)malloc(sizeof(Node)); Node *bp = B; Node *p=n-&...原创 2018-10-20 22:26:40 · 670 阅读 · 0 评论 -
题目7 设计高效率算法,查找倒数第K个元素,打印
设计高效率算法,查找倒数第K个元素,打印 思想:指针等距离同步移动,采用一遍遍历就完成(而不需要先判断长度,再计数)void getlast_kValue(Node* n, int k){ Node* p, *q; p=q=n; int count=0; while(p->next!=NULL){ count++; if(count>=k){ q=q-...原创 2018-10-20 22:28:18 · 284 阅读 · 0 评论 -
题目8 假定两个带头节点的单链表,保存单词,后缀相同时共享相同空间,找出共同后缀的起始位置。
假定两个带头节点的单链表,保存单词,后缀相同时共享相同空间,找出共同后缀的起始位置。 首先:这里给出创建的代码:至于createList函数,写在了头文件中,后面统一给出。char word1[]={'l','o','a','d'}; char word2[]={'p','l','a','y'}; char last[]={'i','n','g'}; Node* node1 = ...原创 2018-10-20 22:31:41 · 3637 阅读 · 3 评论 -
题目9 单链表中保存M个整数,设计一个时间复杂度尽可能高效的算法
单链表中保存M个整数,设计一个时间复杂度尽可能高效的算法,对于链表中绝对值相等的元素(|data|<n),只保留第一次出现的节点,删除其余的节点。如:15->(-3)->(-15)->3 得:15->(-3) 思想: 算法的核心思想是用空间换时间,用辅助数组来记录链表中已经除权的数值,从而对链表扫描的时候,进行存在性判断。辅助数组:由于|...原创 2018-10-20 22:35:12 · 2651 阅读 · 3 评论 -
题目 10 带头节点的单链表,删除所有值为X的节点,并释放空间
带头节点的单链表,删除所有值为X的节点,并释放空间void del_allX(Node*& n, int value){ Node *pre = n, *p = n->next,*q; while(p!=NULL){ if(p->num==value){ q = p; p = p->next; pre->next = p; ...原创 2018-10-21 17:45:51 · 863 阅读 · 0 评论 -
题目11 反向输出所有节点的值,带头节点单链表
题目11:反向输出所有节点的值,带头节点单链表void print_Reverse(Node *n, int first){ //这里使用first使用来标识头节点,头节点中是无效数据,不打印。 if(first==0){ n=n->next; first++; } if(n->next!=NULL){ print_Reverse(n->next, ...原创 2018-10-21 17:53:33 · 806 阅读 · 0 评论 -
链表
今天我们这里讲解单链表,首先看看它的存储结构:typedef struct Node { int num; struct Node * next;}Node;有了链表中结点的数据结构,我们一起来建立单链表:/* 这里创建函数返回创建好的包含头结点的单链表: @int arr[] 是用于建立链表的数据 @int size 是数组的长度 ...原创 2018-08-06 12:36:14 · 442 阅读 · 0 评论