
算法
文章平均质量分 50
belongAL
努力的阿鲤
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
STL源码刨析——sort
以下是阿鲤对STL源码刨析中sort函数的学习总结;希望可以帮助到大家:首先看看reference-c++上是怎样对sort函数描述的由图可以看出,sort是有两个版本的;第一个版本是对区间内的所有呀元素按照从小到大的顺序排列;第二个版本则是使用了一个仿函数作为区间的排序标准的。ok,我们现在知道了sort由两个版本,那就让我们现在走进源码的世界把!版本一:template<class _RanIt> inline void sort(const _RanIt _Fi原创 2020-07-21 00:00:51 · 390 阅读 · 0 评论 -
图解字典树+简单实现+应用(算法题-字典序)
以下是阿狸对字典书学习的总结,希望可以帮助到大家一:字典树的介绍二:字典树的简单实现三:字节跳动真题——字典序原创 2020-06-23 23:29:54 · 735 阅读 · 0 评论 -
单词接龙
一:题目描述:给定两个单词(beginWord和endWord)和一个字典,找到从beginWord到endWord的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。 转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。 所有单词具有相同的长度。 所有单词只由小写字母组成。 字典中不存在重复的单词。 你可以假设b...原创 2020-03-19 20:00:38 · 225 阅读 · 0 评论 -
红黑树的插入删除及迭代器的实现(c++实现)
实现:直接上代码,有注释原创 2020-03-04 20:36:18 · 492 阅读 · 1 评论 -
Huffman Tree(c++实现)
/***************************************************************************************************名称:Huffman Tree基本概念:给定n权值作为n个叶子节点,构造一棵二叉树,若这棵二叉树的带权路径长度达到最小,则称这样的 二叉树为最优二叉树,也称为Huffman树。性质:...原创 2020-02-14 21:14:10 · 413 阅读 · 0 评论 -
二叉搜索树的实现(增,删,顺序输出)
这里只对删除做出部分解释 ①左右子树都有: a、左子树没有右孩子 直接让左孩子继承自己的右孩子和父亲 b、左子树有右孩子 一路向右,找到最后的一个右孩子,然后将这个孩子的 左子树挂在它父亲的右子树上,然后让它继承要删除节点的...原创 2019-11-21 20:44:55 · 402 阅读 · 0 评论 -
另类加法
题目描述:请编写一个函数,将两个数字相加。不得使用+或其他算数运算符。给定两个intA和B。请返回A+B的值测试用例:输入 2 2 输出 4;解析:由于题目中要求不能使用+之类的算术运算符,所以我们第一时间就应该想到使用位运算符;我们根据位运算符的特点可以得到:&可以找出需要进位的位,^可以找到不需要进位的位所以有以下代码class UnusualAdd {...原创 2019-11-15 17:02:23 · 164 阅读 · 0 评论 -
二叉树后序遍历的三种解法(图解两种非递归)
题目描述:给定一个二叉树,返回它的后序遍历。示例:如下图二叉树的后序遍历结果为 {4,5,2,6,7,3,1};解析:递归一种,非递归两种首先给出三种方法的链接method 1:递归递归的方法很简单,递归就完事了;method 2:栈的后序遍历(非递归)这个方法就是利用栈来保存下一次需要访问到的节点,但是再后序遍历中我们需要一些特殊的标记,来防止其的重复进出栈;...原创 2019-10-29 19:26:12 · 2643 阅读 · 0 评论 -
详解矩阵的螺旋输出
题目描述:给定一个包含mxn个元素的矩阵(m行,n列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例:输入如图所示的二位数组,输出{1,2,3,4,8,12,11,10,9,5,6,7}解析:对于该题我们的出发思路应该是怎样可以控制两个下标(i和j(行和列下标))将一个二位矩阵按照螺旋输出呢?首先我们可以看到。这样的螺旋输出总共有四个走向;分别为向右、向下、向左...原创 2019-10-29 12:00:34 · 3110 阅读 · 1 评论 -
详解跳跃游戏
题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例1: 输入: [2,3,1,1,4] 输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例2:输入: [3,2,1,0,4] ...原创 2019-10-24 20:46:38 · 553 阅读 · 0 评论 -
最长回文字串的三种解法
题目描述:给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"想看代码的请点击这里^_^method one:暴力算法解析:暴力算法就是字符串的每一个可能的字串进行判断;时间复杂度 ...原创 2019-10-22 18:09:16 · 243 阅读 · 0 评论 -
判断大小端
在计算机存储中有两种存储方式,分别为大端,小端;大端存储:高权重的存放在高地址小端存储:低权重的存放在高地址原创 2019-06-10 07:14:09 · 957 阅读 · 0 评论 -
把一段升序数组向右平移n位后的二分查找
题目描述:把一段升序数组向右平移n位后,可以使用logn的时间复杂度找出一个元素的位置。eg:arr[] ={4,5,6,7,8,9,1,2,3} 输入3后可以用logn的算法找出它的位置。分析:首先设定left = 0, right = size, mid = (left+right)/2, k 为需要查找的数;我们需要在longn的情况下算出这道题所以我们必须使用二分查找,具体思...原创 2019-10-19 20:11:54 · 545 阅读 · 0 评论 -
简单讲解最大连续子数组问题
题目描述:求出一个数组中连续子数组的和eg:{6,-3,-2,7,-15,1,2,2}所以最大连续字数组的和为(6,-3,-2,7 )为8。method one:贪心算法在使用贪心算法求解最大子数组问题之前,我们就要贪心,贪心的可以让连续的子数组越来越大,那么我们应该怎样贪心呢?解析:首先我们想要得到数组中最大的连续子数组,那我们就得遍历整个数组,那么我们想要在遍历完数组后就可...原创 2019-10-17 21:25:34 · 1676 阅读 · 0 评论 -
只出现一次的元素
题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素比如下方:输入 输出 [0,1,0,1,0,1,99] 99 [2,2,3,2] 3 method1:统计二进制对应位1的个数我们在此以[2,2,3,2]为例子,在这里进行解析;c++实现:class Solution {p...原创 2019-10-16 21:28:55 · 284 阅读 · 0 评论 -
怎样把二叉搜索树转化成排序双向链表?
一:首先介绍二叉搜索树;概念:二叉搜索树是指在一颗二叉树上,这颗二叉树上的每个节点都有:所有左节点 < 该节点 < 所有右节点; 例如下树二:根据搜索二叉树特性分析因为二叉树的实现也是靠指针实现的,所以其数据结构和双向链表的结构是相同的;若把箭头话上,就变成了这样子。注:红色代表指向空所以根据特性,我们只需要将每个节点左边的节点均放在其左边;把每个节点...原创 2019-10-12 17:11:04 · 194 阅读 · 0 评论 -
图解排序(附有实现代码)
以下是阿鲤在学习中对排序的一个总结,希望对大家有所帮助;若有不对之处,请慷慨指出。以下是阿鲤本次分享的顺序(c语言实现)1:插入排序2:希尔排序 == 插入排序优化3:选择排序 + 选择排序优化4:冒泡排序;5:堆排序6:归并排序7:递归版本快速排序8:快速排序的优化,hoare版本9:非递归版本快速排序10:实现代码1:插入排序首先上代码...原创 2019-09-26 21:07:05 · 307 阅读 · 0 评论 -
图解二叉树的创建及部分操作
以下是阿鲤对二叉树的学习及理解,特此分享,希望能帮到部分同学;若有不多支出请慷慨指出。阿鲤将将以以下顺序讲解(c语言实现)BTNode *_CreateBinTree(char *array, int size, int* index, BTDataType invalid);//二叉树的建立BTNode *CreateBinTree(char *array, int size, BT...原创 2019-09-24 17:47:30 · 877 阅读 · 0 评论 -
使用堆求大量数据的 topk
首先这个是堆介绍及实现的链接假设你有n个数据需要求出其前k个最大数有以下几步(我们假设k=5):n个数据为(1,8,23,5,76,90,12,15,7,2,14,66,88,33,12,48,95,46)首先上代码:(之后有详细图解)#include<stdio.h>#include<stdlib.h>#include<assert.h&g...原创 2019-09-22 10:19:51 · 353 阅读 · 0 评论 -
给定一个无头单链表的非尾节点的位置,请你删除它(单链表面试题)
首先我们给出函数代码void pListDelete(pList *p) //p为非尾节点{ assert(p&&p->next);//确定边界 pList pCur = p->next; p->data = pCur->data;//把p->next的值域赋值给p的值域 p->next = pCur->next; ...原创 2019-09-17 20:54:37 · 188 阅读 · 0 评论 -
队列的介绍及面试题(用队列实现栈)
一:队列的概念队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表;队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头、二:队列的实现队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。...原创 2019-09-16 22:53:19 · 261 阅读 · 0 评论 -
报数 - 递归解决 (c)
首先 描述题目;括号内部是解释(对上一层的藐视)输入 输出 1 1(一) 2 11(一个一) 3 21(两个一) 4 1212(一个二,一个一) 5 11121112(一个一,一个二,一个一,一个二) 6 31123112(三个一,一个二,三个一,一个二) 这样例如你输入5就会输出“11121112”;代码实现:递归...原创 2019-08-31 12:10:09 · 243 阅读 · 0 评论 -
计算数组中第三大元素
注:阿鲤实在Linux平台上测试的#include<stdio.h>int Third(int *nums,int numsSize){ int i = 0; int min = nums[0]; while(i < numsSize)//find the smallest number. { if(min > nums[i]) ...原创 2019-08-29 15:04:33 · 435 阅读 · 0 评论 -
盛最多水的容器
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。两种解法解法一:暴力解法,时间复杂度O(n^2)#include<stdio.h>#include<stdlib...原创 2019-08-21 15:09:44 · 117 阅读 · 0 评论 -
小端逆序大端
c语言编码,实现函数long htonl(long a),也就是将主机序转化为网络序网络序统一为大端。该算法主要需要测试主机序,如果是大端则不做任何的改变,如果是小端则逆序首先,请看代码;#include<stdio.h>#include<stdlib.h>int htonl_small(){ int a = 1; return *((char*)...原创 2019-08-25 15:26:39 · 282 阅读 · 0 评论 -
删除字符串中的空格
eg:输入 **aaa**bbbb*****c** 输出 aaa*bbbb*c代码:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>void Delete(char arr[]){ int i = 0; int j = 0; while (arr[j]) {...原创 2019-08-25 11:30:16 · 177 阅读 · 0 评论 -
实现自己的pow(x,y),返回x^y
方法一:递归调用#include<stdio.h>#include<stdlib.h>int Mypow(int x, int y){ int result = 0; int tmp = 0; if (y == 0) return 1; if (y == 1) return x; tmp = Mypow(x, y / 2); if ((y &...原创 2019-08-24 14:57:07 · 368 阅读 · 0 评论 -
输入两个子数组,从第一个字符串中删除第二个字符串中的所有字符
#include<stdio.h>#include<stdlib.h>char* Delete(char *str1,char *str2){ int arr[256] = { 0 }; while (*str2 != '\0') { arr[*str2] = 1; str2++; } char *p = str1; char *q = st...原创 2019-08-20 16:05:08 · 383 阅读 · 0 评论 -
因为数据量太小结果O(n)比O(n^2)慢
题目:实现strStr()函数。给定一个haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回-1。O(n^2)#include<stdio.h>#include<stdlib.h>int strStr(char * haystack,...原创 2019-08-24 08:33:20 · 274 阅读 · 0 评论 -
求最后一个单词的长度
方法一:从后遍历int lengthOfLastWord(char * s) { int len = strlen(s) - 1; char *p = s; int count = 0; if(len == -1) { return 0; } while ((count == 0 || *(p+len) != ' ') && l...原创 2019-09-01 08:30:05 · 168 阅读 · 0 评论 -
输入十进制以十六进制输出 (类似与c中的以%x输出)
eg:输入26输出a1;输入-1输出ffffffff直接上代码,有注释#include<stdio.h>void Conversion(unsigned int n , char *str)//直接将num转化未unsigned类型,可以保证{ //负数的正确输出 int i =...原创 2019-09-02 16:54:36 · 554 阅读 · 0 评论 -
栈的介绍及面试题代码(括号匹配问题)
1:栈1.1栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。——后进先出 1.2:栈的实现...原创 2019-09-16 13:48:40 · 206 阅读 · 0 评论 -
图解复杂链表的拷贝
描述:给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的深度拷贝。、函数代码:头文件:#ifndef _PLIST_H_#define _PLIST_H_#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>...原创 2019-09-14 18:35:39 · 187 阅读 · 0 评论 -
查找带环链表的入环点——数学+图 = 证明
首先上代码(c代码)void pListFirstRingNode(pList *pHead){ pList pFast = *pHead; pList pSlow = *pHead; pList pTmp = NULL; while (1) { pFast = pFast->_pNext->_pNext; pSlow = pSlow->_pNext...原创 2019-09-13 21:24:15 · 433 阅读 · 0 评论 -
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前(图解)
题目描述:编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前eg: 输入:1,4,5,3,2,2,6 和 3 输出:1,2,2,4,5,3,6首先上代码:(c语言实现)pList pListTwoPart(pList *pHead, DataType val){ assert(pHead); pList...原创 2019-09-13 16:12:24 · 3347 阅读 · 0 评论 -
无头单链表的一些基本操作
实现以下功能pList pListinit(pList *pHead);//初始化void pListPushBack(pList pHead, DataType data);//尾插pList pBuyNewNode(DataType data);//创建一个新节点void pListShow(pList pHead);//打印void pListDeleteAll(pList...原创 2019-09-11 22:08:43 · 272 阅读 · 0 评论 -
图解无头单链表的两种逆置方法
方法一:三指针法首先,上代码void pListReversal1(pList *pHead)//反转单链表1:三指针法{ assert(pHead); pList pFast = *pHead; pList pMiddle = *pHead; pList pSlow = NULL; while (pFast) { pFast = pFast->_pNext;...原创 2019-09-11 20:14:59 · 1471 阅读 · 0 评论 -
数据结构之顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成数据的增删查改;在这份代码里分别完成了一些线性表的功能;在我理解,线性表就是将数组结构化。list.h#ifndef _LIST_H_#define _LIST_H_#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>...原创 2019-09-07 16:58:17 · 191 阅读 · 0 评论 -
不带头节点总结
这些基本的操作在代码里都有注释,任意位置插入有图解,有了这些应该可以看懂了,看不懂的话请留言阿鲤给你解释。希望可以对大家有一点帮助(文件在最后)首先任意位置插入的图解:首先总代码是这样的void SListInsert(pNode pos, SDataType data)//任意位置插入{ if (NULL == pos) return; else { pNode...原创 2019-09-08 10:09:22 · 191 阅读 · 0 评论 -
求最大子数组
方法一:迭代,这种方法时间复杂度为O(n^2)int GetMaxAddOfArray(int *arr, int sz){ int SUM = -100000; //给定一个足够小的最大值 for (int i = 0; i < sz; i++) { for (int j = 0; j < sz; j++) { ...原创 2019-08-19 16:37:27 · 224 阅读 · 0 评论