![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
liangximin2046
学生
展开
-
线性排序算法:桶排序和基数排序
0 前言今天刷Leetcode的时候遇到一道题使用了基数排序,是一种线性时间的排序方法,感觉蛮有意思的,特地记录。1 桶排序桶排序的原理是这样:有时候我们只需要对整数排序,而且这些整数都有一个不大的上界M,于是我们使用一个大小为M的数组count,初始化为0,称count为一个有M个单元的桶。当读入一个数AiA_iAi时,令count[Ai]count[A_i]count[Ai]加1即可。读入所有数据之后,扫描count打印出数字即可。如下图所示,给学生分数排序时只需造一个M=100的桶,依次读入原创 2020-11-26 19:48:43 · 184 阅读 · 0 评论 -
c++实现链表插入排序和归并排序
0 前言最近刷leetcode时遇到了两道链表排序题,相对数组排序而言处理上复杂了一些,却蛮有意思。有必要记录一下。1 插入排序Leetcode第147题对链表进行插入排序并不复杂,相对于数组的插入排序来说思路是直接可以用的。首先我们设置一个dummy头节点,然后从待排序链表里依次拿出节点,放入dummy链表里的合适位置即可。p1和p2是用于寻找合适插入位置的两个指针。算法复杂度o(n2)o(n^2)o(n2)。/** * Definition for singly-linked list. *原创 2020-11-03 11:06:04 · 588 阅读 · 0 评论 -
回溯法求解数组全排列和全组合问题(c++)
0介绍回溯法是学习算法的一个坎,它将许多代码基础不够扎实的同学挡在通往更高水平的门外。究其原因,是因为回溯法本身与递归有着千丝万缕的关系,同时也要求学习者具备较强的抽象问题的能力。所以在学习回溯法之前,学习者必须熟练解决一些常见的递归问题,如二叉树的遍历、LCA问题等,这些问题leetcode均有题目,读者不妨先去练练手再回来。如果能熟练写出常见递归问题的代码,回溯法也就如庖丁解牛了。下面介绍两个回溯法练习的入门题,数组元素的全排列和全组合求解。1 回溯法求解数组全排列leetcode第46题考察了这原创 2020-08-24 20:37:06 · 1899 阅读 · 0 评论 -
树的公共祖先(LCA)问题:Leetcode235题和236题
0 介绍树的公共祖先问题(LCA)是一个经典的问题。所谓公共祖先,它的定义如下。对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。–摘自百度百科如图片所示,0和5的公共祖先是2。这个问题一般有两种形式,一种是问一颗二叉搜索树某两个节点的公共祖先,一种是问普通的树上两个节点的公共祖先。下面我们来介绍一下解法。1 二叉搜索树上的LCAleetcode235题考查了这个问题。对于二叉搜索树的原创 2020-08-20 20:11:09 · 244 阅读 · 0 评论 -
c++实现最短路径算法(Dijkstra算法)
0简介Dijkstra算法是一种计算某一顶点到其余顶点最短路径的算法。它采用了贪心的策略,实现时使用了广度优先。这个算法常学常忘,因此写篇博客彻底解决它。1计算步骤介绍Dijkstra的计算步骤不难,如下(1)设置一个集合表示已经标记过的节点,初始化为空(2)使用一个数组d记录所有节点与源节点s的距离,初始化d[s] = 0,其余设置为INF(3)循环n次{ 在未标记的节点中,选出d值最小的节点x; 将x加入标记过节点的集合; 对于从x出发的所有边(x,y),更新d[y] = min(d原创 2020-08-17 20:13:32 · 6045 阅读 · 4 评论 -
c++实现链表反转:leetcode206题和92题
0 介绍链表反转是一道常见的算法面试题,题意也很直白,就是让你将一个指定链表反序。Leetcode206题和92题考查了这样一道题目,下面来看一看。1 Leetcode206题-反转链表I该题题目描述如下:反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL解决这样一个问题需要三个指针pre、cur、tail,以示例输入为例,我们首先将pre初始化为空指针,cur初始原创 2020-08-16 18:56:00 · 167 阅读 · 0 评论 -
双指针(双索引)算法介绍(c++)
0 简介双指针算法在一些数组题中很常用,它指的是一类使用两个指针遍历数组求解问题的方法,这里的指针是广义上的,有可能是c/c++中的指针,也有可能仅仅是两个整数下标。双指针算法有两种形式,一种被称为对撞指针,两个指针从两端向中间靠拢;另一种是快慢指针,两个指针向统一方向运动,滑动窗口方法就是一种常用的快慢指针方法。1 对撞指针对撞指针的思想如前所述,下面举一道具体的例题来说明。这道题是leetcode345题。题目描述如下编写一个函数,以字符串作为输入,反转该字符串中的元音字母。示例 1:输原创 2020-08-09 21:11:42 · 700 阅读 · 0 评论 -
c++实现快速排序
0 介绍快速排序是目前已知排序速度最快的排序算法,平均时间复杂度o(nlogn)o(nlogn)o(nlogn)。快速排序的思想很朴素,但是实现起来却很困难,一度被认为是一种理论上极值优化却无法实现的算法,原因在于有太多的细节需要把控。网上的快排代码许多是有错误的,或者可读性不高,这里把自己的代码分享出来,希望可以帮助到大家。代码已经通过leetcode912题的测试。用的时候直接调用我的quickSort函数即可。vector<int> sortArray(vector<int>原创 2020-08-05 17:45:47 · 229 阅读 · 0 评论 -
c++实现归并排序
0 介绍归并排序是一种常见的排序算法,时间复杂度o(nlogn)o(nlogn)o(nlogn)。它是经典的分治算法的应用,学习这个算法,不仅仅是学习排序本身,更重要是体会分治思想。下面谈谈具体的算法步骤。1 合并两个有序数组在我们介绍归并排序算法之前,不妨先考虑一下如何考虑如何合并两个有序数组的问题。这个问题在Leetcode88题也有,你不妨先练练手再回来。这个问题并不难,我们假设待归并的两个数组在同一个数组nums里,第一个数组的左右界限是left和rightEdge-1,第二个数组的左右界限原创 2020-08-04 22:07:51 · 360 阅读 · 0 评论 -
三种简单排序算法:冒泡排序、选择排序、插入排序(c++实现)
0 简介排序问题是一个基础又重要的问题,无论是工作面试或是考试都常常遇到。之前学习了一系列排序算法,但是很久不看又忘记了,特此总结。先总结一下三种简单的排序算法,后续总结更高级的算法,如归并、快排等。以下算法均为升序排序。1 冒泡排序冒泡排序是大多数人接触到的第一个排序算法,它的算法采取了逐渐缩小未排序序列的思路。对于一个长度N的数组,具体的算法步骤为:首先确定未排序的序列长度为N,然后让未排序序列中最大的值浮游到末尾(冒泡名称的由来),第二步,确立未排序的序列长度为N-1,在未排序序列中找到最大的值原创 2020-08-04 19:09:20 · 431 阅读 · 0 评论 -
c++实现二分查找(折半查找)算法
二分查找是一种常用的查找算法,它主要用于在一个已经排好序的线性表中。下面来看具体问题描述。问题描述:给定一个整数X和整数,后者已经预先排序并在内存里,求下标使得,如果不在数据中,返回解决思路:一种自然而然的想法是从左到右扫描,它的运行时间是线性的,但是对于一个庞大的数据量来说,这种方法不是最好的。如果我们合理地使用这个线性表已经排好序这一条件,将大大提高效率,二分查找就是这...原创 2019-12-03 11:34:45 · 2016 阅读 · 0 评论