算法&数据结构
imxietx
这个作者很懒,什么都没留下…
展开
-
AXin说算法:找出链表中倒数第K个节点
面试官:告诉我怎么找出链表中倒数第K个节点!AXin:从后往前走K步不就行了。面试官:不好意思,我说的链表是单链表,只能从前往后走。就像下面这样!倒数第二个就是值为5的节点。AXin:这。。。容我想想。面试官:怎么,不会?【片刻之后。。。】AXin:没有的事儿,这难不倒我,用双指针呗,和你上次问我怎么判断链表是否有环差不多的思路。面试官:不错啊小子,还会举一反三了。那你说说怎么解决。AXin:咱们学小学生,看图说话。以找出倒数第3个节点为例:AXin:要找出倒数第K个节点,只需让B指针原创 2020-05-21 16:23:17 · 348 阅读 · 0 评论 -
AXin说算法:如何判断链表有环?
面试官:你来说说怎么判断链表有环?AXin:什…什么是链表有环?面试官:环都不知奥?喝乌俺~huan,环,就是下面这个样子,只会出现情况1和情况2,不会出现情况3这种。而且环有且只有一个,一定包含最后一个节点。(PS:情况3已经是有向图了,不是链表)AXin:我…我想一想。面试官:别墨迹了,你就说你会不会吧?【30分钟后…】AXin:我想到了!面试官:快说!我两把王者都打完了!AXin:好嘞!用两个指针,指针A一次向前走一步,指针B一次向前走两步,如果指针A和指针B能够相遇,说明链表中有环原创 2020-05-20 11:42:51 · 414 阅读 · 0 评论 -
由前序遍历和中序遍历重建二叉树
找到根节点和左子树根节点以及右子树根节点后,可以递归地重建子树/* 由前序遍历序列和中序遍历序列重建二叉树 */#include <iostream>#include <cstdlib>using namespace std;struct Node{ int val; Node* left; Node* right;};Node* construct(int* pr原创 2017-03-26 16:06:59 · 2725 阅读 · 2 评论 -
算法基础2:插入排序
#include <stdio.h>#define MAXLEN 100void insertionSort(int arr[], int length);void showSeq(int arr[], int length);int main(){ int arr[MAXLEN]; int n, i; while (1 == scanf("%d", &n))原创 2017-03-16 11:57:30 · 516 阅读 · 0 评论 -
算法基础1:冒泡排序
#include <stdio.h>#define MAXLEN 100void swap(int* a, int* b);void bubbleSort(int arr[], int length); // 递归版void bubbleSort2(int arr[], int length); // 非递归版void showSeq(int arr[], int lengt原创 2017-03-16 11:46:42 · 483 阅读 · 0 评论 -
树:将二叉搜索树转换为排序的双向链表
将二叉搜索树树转换为排序的双向链表,听起来可能是个比较复杂的问题,其实并不是很难。思路如下:首先找到头结点,即最左最深处的结点。中序遍历。更改结点的 leftleft 和 rightright 指针。其实总结上面三条即是,用一个指针保存中序遍历中的前一个结点,并将前一个访问的结点的 rightright 指针指向当前访问结点,把当前访问结点的 leftleft 指针指向前一个访问的结点。原创 2017-03-31 22:30:48 · 562 阅读 · 0 评论 -
动态规划:青蛙跳台阶、变态跳台阶
青蛙跳台阶问题是一个简单的动态规划问题。问题1:普通跳台阶一只青蛙可以一次跳 1 级台阶或者一次跳 2 级台阶,例如:跳上第 1 级台阶只有一种跳法:直接跳 1 级即可。跳上第 2 级台阶有两种跳法:每次跳 1 级,跳两次;或者一次跳 2 级。问要跳上第 nn 级台阶有多少种跳法?很多人喜欢正向思考,使用暴力求解,但往往这是一个很复杂的问题。我们可以反过来思考:如果我们要跳上第 nn 级台阶,原创 2017-03-27 23:01:36 · 9771 阅读 · 3 评论 -
算法基础6:堆排序算法
参考《算法导论》P84~P90#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100void heapSort(int a[], int heapSize); // 堆排序void maxHeapify(int a[], int i, int heapSize); // 维护以i为根节点的最大堆的性质void buildMaxHea原创 2017-03-19 14:06:14 · 650 阅读 · 0 评论 -
算法基础5:希尔排序(缩减增量排序算法)
#include <stdio.h>#include <stdlib.h>#define MAXLEN 100int readSeq(int a[]); // 读入一个整数序列,返回读入的整数的个数void showSeq(int a[], int n);void shellSort(int a[], int n);int main(){ int n, nums[MAXLEN];原创 2017-03-19 11:47:36 · 867 阅读 · 1 评论 -
算法基础4:快速排序(随机化版本)
#include <stdio.h>#include <stdlib.h>#define MAXLEN 100int readSeq(int a[]); // 读入一个整数序列,返回读入的整数的个数void showSeq(int a[], int n);void quickSort(int a[], int p, int r);int partition(int a[], int p,原创 2017-03-18 20:12:51 · 599 阅读 · 0 评论 -
字符串循环右移
编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefg” 函数头是这样的: //pStr是指向以'\0'结尾的字符串的指针 //steps是要求移动的nvoid LoopMove(char * pStr, int steps){ //请填充...}答案:#include <stdio.h>#原创 2017-03-05 18:34:34 · 1239 阅读 · 0 评论 -
算法基础3:归并排序(Merge Sort)
#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100void MergeSort(int a[], int n);void mergesort(int a[], int p, int r, int tmp[]);void merge(int a[], int p, int q, int r, int tmp[]);void sho原创 2017-03-16 23:24:10 · 1002 阅读 · 1 评论 -
排序:插入排序
插入排序可以说是最简单也是最基础的排序算法。但是因其时间复杂度为 O(n²),所以在数据量很大的情况下效率不高。效率更高的有归并排序和插入排序。以及一些概率性的排序算法。就简单贴一下代码和运行结果了:#include #define MAXLENGTH 100void insertSortAscending(int array[], int n); //升序void insertSo原创 2015-11-25 21:49:54 · 612 阅读 · 0 评论 -
排序:归并排序
归并排序较插入排序要好很多,时间复杂度为 nlogn ,在数据量很大的情况下跟插入排序比起来,那优势就非常明显了。归并排序的代码如下:#include #define MAXSIZE 100void MergeSort(int a[], int s, int e); //递归分解过程void Merge(int a[], int s, int m, int e); //实际原创 2015-11-27 20:54:34 · 803 阅读 · 0 评论 -
《算法第四版》环境搭建
博主用的是Eclipse。配置Java开发环境就省略了,下面主要说怎么在Eclipse中使用书本自带的库。1.下载algs4.jar点击下面的链接下载algs4.jar http://algs4.cs.princeton.edu/code/algs4.jar2.配置环境首先,将下载好的库放到自己喜欢的一个目录下,最好路径无空格无中文。然后在用户环境变量CLASSPATH中添加该库的路径,如果没有该原创 2016-10-12 15:26:18 · 9464 阅读 · 13 评论 -
动态规划:钢条切割问题实现
钢条切割问题是这样的:一段钢条可以被切割成若干长度不一的更短的钢条,给定一个价目表,问如何切割收益最大。其中价目表包括了长度为从i=1到i=n的钢条分别的价格Pi。比如P1=1,P2=5表示长度为1的钢条的价值为1,长度为2的钢条的价值为5。这是一个典型的动态规划问题。第一种方法是自顶向下的方法,假定我们已经知道了长度为K的钢条的最大收益,然后通过这个最大收益求解长度为K+1的原创 2015-11-18 22:24:43 · 985 阅读 · 0 评论 -
动态规划:游艇租用问题
问题描述:长江游乐俱乐部在长江上设置了n个游艇出租站,游客可以在这些游艇出租站用游艇,并在下游任何一个游艇出租站归还游艇,游艇出租站i到j之间的租金是rent(i,j),其中1这是一道典型的动态规划问题。解题的思路是,既然要得到最小的花费,那么就从最底层开始,逐层向上计算每两个站之间的最小花费,并记录在数组中,有记录的就不必再算了。其中两个站可能是相邻的,也可能不是相邻的。然后要得原创 2015-11-17 12:52:24 · 17603 阅读 · 3 评论 -
动态规划:最长公共子序列问题
最长公共子序列问题(Longest-common-subsequence Problem)简称LCS问题。题目为给定两个序列X、Y求它们的LCS(最长公共子序列),这里的子序列Z的定义为:Z中的元素既在X中也在Y中,并且他们在X、Y中满足严格的下标为一个增序列(假设下标从左到右依次增大)。另外,不要求Z中的元素在X、Y中是连续的,比如当A = {A, B, C, D, B, C, A},B = {原创 2015-11-20 17:29:17 · 983 阅读 · 0 评论