
算法
燕雀于鸿鹄
不积跬步无以至千里
不积小流无以成江海
展开
-
剑指LeetCode -- 第四题 -- 寻找两个有序数组的中位数 -- 困难
class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int n1Len = nums1.length; int n2Len = nums2.length; int i = 0, j = 0; List<Int...原创 2019-09-26 23:03:14 · 273 阅读 · 1 评论 -
剑指LeetCode -- 第三题 -- 无重复字符串最长子串 -- 中等
解法一class Solution { public int lengthOfLongestSubstring(String s) { String temp = ""; int maxLen = s.length() > 0 ? 1 : 0; int index = 0; char c; for(...原创 2019-09-26 22:13:58 · 145 阅读 · 0 评论 -
三十三、有权最短路径算法(有负值边)
与有权、无权最短路径算法实现思想一样,请参考前面文章,不懂得请自行看书。//伪代码 有权最短路径算法(有负值边)//假设已经对表进行初始配置void WeightedNegative(Table T){ //声明队列 Queue Q; //V : 入度顶点 W : 出度顶点,与V连接的顶点 Vertex V, W; //创建队列 Q = CreateQueue(NumVe...原创 2019-07-24 22:44:02 · 801 阅读 · 0 评论 -
三十二、Dijkstra算法 -- 有权最短路径算法(无负权值)
和无权最短路径算法同理,伪代码,代码已加注释,思路很清晰,不理解的地方请自行看书。//伪代码 Dijkstra算法 -- 有权最短路径算法(无负值边)//假设已经根据图生成了用于Dijkstra算法的初始配置表void Disjkstra(Table T){ //V : 入度点 W : 出度点(与V连接的顶点) Vertex V, W; while(true) { /...原创 2019-07-24 21:56:07 · 353 阅读 · 0 评论 -
二十八、快速查找
直接上代码了,和快速排序没什么区别#include <stdio.h>//当元素个数达到一定数量时可以用简单的排序算法#define CutOff 3//插入排序void InsertionSort(int array[], int size){ int i, j, temp; for(i = 1; i < size; i++) { temp = ar...原创 2019-07-17 21:45:38 · 168 阅读 · 0 评论 -
二十七、快速排序
快速排序其实是逐次对每个基数进行排序,当达到一个临界值(也就是当元素个数达到一定数量时,简单的插入排序速度会大于快排)的时候就用插入排序来进行,其实这也是一个分治处理的过程,和归并思想大同小异,由于归并要进行多次递归,而快排基于基数每次进行线性时间的分组,所以理想情况下快排优于归并。这里就直接上代码。。。#include <stdio.h>//当剩余元素数较小时,简单的插入排...原创 2019-07-17 00:03:28 · 150 阅读 · 0 评论 -
三十一、无权最短路径排序
最短路径排序就好比我们从A城市出发到E城市办事,中间根据选择不同的路可能经过B,C,D三座城市,那么我们怎么选择出行路线能让我们以最快时间到达E城市就成了一个问题,而最短路径排序就是解决这种问题的一种方案。其实最短路径排序,就是对整个有向图进行一次搜索,此方法也被称为广度优先搜索,类似于树的层序遍历。这里也是提供的伪代码,注释很清晰,如有不懂请参考数据结构与算法C语言描述版。//伪代...原创 2019-07-23 23:53:30 · 191 阅读 · 0 评论 -
三十、拓扑排序
其实所谓的拓扑排序,就是对有向图的指向顺序的一种排序。好比我们打游戏,10级的时候我们只能做10级的任务,到了20级可能会再开启两个任务,以此类推。其实就是对做执行任务顺序的一种约束。下面的代码是伪代码,个人觉得没有必要去实现,我们只需要掌握思想,思想大于一切。代码中的注释很清晰,给出了简单和进阶的两种实现方式,如有不懂请自行参考数据结构与算法分析C语言版//伪代码,拓扑排...原创 2019-07-23 23:48:56 · 208 阅读 · 0 评论 -
二十六、算法 -- 插入排序,希尔排序(缩小增量排序),堆排序,归并排序
不写讲解了,直接贴代码了。这里稍微有点难度的就是归并排序了,分治思想的初级体现,一定要仔细研究。1、插入排序//插入排序,类似于二叉堆的下溯void InsertSort(int array[], int size){ int i, j; for(i = 0; i < size; i++) { int temp = array[i]; for(j = i;...原创 2019-07-10 00:34:57 · 168 阅读 · 0 评论 -
十七、桶排序(Bucket Sort)
先说下桶排序的原理,其实就是先构造一个空的数组,所有元素初始化为0。然后待排序数组进行遍历,把该元素的值在对应桶的数组的下标的位置的元素的值加一,就可以完成排序。 对于桶排序的弊端很严重,比如我们待排序的数组有重复元素和负数那他的时间复杂度都为O(m+n),当数据足够多的时候我们的系统是承受不了的,但对于没有重复元素,也没有负数,那它的时间复杂度为O(n),这个时间是在我们接受的范...原创 2019-06-18 15:15:20 · 332 阅读 · 0 评论 -
十六、链表实现一元多项式存储结构和算法
和数组实现的思想一样,唯一的优点就是不会浪费空间,链表不懂得可以看第十四篇文章和一二篇文章#include <stdio.h>#include <stdlib.h>//定义多项式链表存储结构typedef struct PNode{ int factor; //系数 int power; //次数 | 幂 PNode *next; //指向下一个...原创 2019-06-18 14:00:18 · 2853 阅读 · 0 评论 -
十五、数组实现一元多项式存储结构的计算(加法)
这里只写了一种加法运算,其他的运算方法大同小异就没有介绍,用数组存储的思想就是系数所在的数组位置的下标就是X的次数, 例如int coeffArray = {6,6,8,0,6,4} 转换成多项式就是6+6x+8x^2+6x^4+4x^5,根据此思想便可进行运算,代码里的注释也算是完善,后面会写一篇用链表来进行操作一元多项式,因为用数组存储当一元多项式的次数不连续时,会造成空间的浪费,过多...原创 2019-06-18 12:44:54 · 1709 阅读 · 0 评论 -
十一、KMP模式匹配算法 -- 改进版(nextVal实现法)
KMP算法详解,此次针对上一篇文章的next实现算法的改进主串 a a a b c a a a a 子串 a a a a 下标 0 1 2 3 4 5 6 7 8 由上图可以看到如果用next数...原创 2019-06-10 15:56:56 · 1017 阅读 · 0 评论 -
十、KMP模式匹配算法 -- 经典版(next实现法)
KMP算法详解(本文章的KMP算法的实现是用C语言,没有进行串的存储结构的实现,使用的是char数组)引言: 我们在小学的时候老师一定教过我们怎么查字典(不知道怎么查字典的请自行百度),其实查字典的一个过程,就好像我 们在写代码有时候需要在一个很长的字符串中去查找一个(或一段)子串,这个时候我们就会写一个程序来帮助我们找。也就引出...原创 2019-06-08 01:20:36 · 618 阅读 · 0 评论 -
剑指LeetCode -- 第五题 -- 最长回文子串 -- 中等
class Solution { public String longestPalindrome(String s) { if(s == null || s.length() <= 1) { return s; } int start = 0, end = 0; for...原创 2019-09-27 15:33:02 · 118 阅读 · 0 评论