数据结构
文章平均质量分 71
Fly_Fly_Zhang
初学java
展开
-
数据结构-排序-快速排序之固定位置选取基准法(递归/非递归)
思想:均匀的分割待排序序列 :选取一个基准par,定义两个指针 low high 一般基准选取low下标的值;如果high下标的值比par大,high–;反之将high的值放到low 下标; low的操作和high 一样 ;当high和low 相遇时,将par放到low角标,此时,左边全是比par小的,右边全是比par 大的;快速排序:递归实现public static int part...原创 2018-12-13 19:56:26 · 754 阅读 · 0 评论 -
数据结构-排序-归并排序(二路归并)
思路:归并排序是建立在归并操作上的一种有效的排序算法,是采用分治法的一个典型应用; 即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。首先考虑如何将两个有序数组合并,这个只需要比较两个数组的s谁小先将谁放入新数组,直到是走到末尾;class TestMergeSort{ /* * @Description : ...原创 2019-01-09 17:03:58 · 1180 阅读 · 0 评论 -
随笔-字符串的排列(巧妙解法-判断 s2 是否包含 s1 的排列)
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。换句话说,第一个字符串的排列之一是第二个字符串的子串。原创 2019-01-25 03:06:33 · 7476 阅读 · 3 评论 -
数据结构-排序-快速排序的优化(三分取中法实现)
优化一:当待排列序列的长度分割到一定大小时,使用插入排序原因:对于很小和部分有序的数组,快排不如插入排序好。当待排序序列的长度分割到一定大小后,继续使用分割的效率比插入排序要差; 但是三分取中+插入排序还不能处理重复数组;优化二:聚集相同基准法;处理重复的数组元素原因:在一次分割结束后,可以把与par相等的元素聚集在一起。下次分割时,不用在对和par相等元素进行分割举例:待排序序列 1...原创 2019-01-09 13:33:28 · 865 阅读 · 0 评论 -
数据结构-排序-快速排序之三分取中法
思想:引入的原因:虽然随机选取枢轴时,减少出现不好分割的几率,但是还是最坏情况下还是O(n^2),要缓解这种情况,就引入了三数取中选取枢轴分析:最佳的划分是将待排序的序列分成等长的子序列,最佳的状态我们可以使用序列的中间的值,也就是第N/2个数。可是,这很难算出来,并且会明显减慢快速排序的速度。这样的中值的估计可以通过随机选取三个元素并用它们的中值作为枢纽元而得到。事实上,随机性并没有多大的帮助...原创 2019-01-09 12:16:59 · 1218 阅读 · 0 评论 -
数据结构-排序-快速排序之随机选取基准法
思想:基本的快速排序选取第一个或者最后一个元素作为基准。这样在数组已经有序的情况下,每次划分将得到最坏的结果。一种比较常见的优化方法是随机化算法,即随机选取一个元素作为基准。这种情况下虽然最坏情况仍然是O(n2),但最坏情况不再依赖于输入数据,而是由于随机函数取值不佳。实际上,随机化快速排序得到理论最坏情况的可能性仅为1/(2n)。所以随机化快速排序可以对于绝大多数输入数据达到O(nlogn)的期...原创 2019-01-09 11:56:27 · 3078 阅读 · 0 评论 -
随笔-找出数组中第K大的值(快速排序,堆排序实现)
题目: 找出数组中第K大的值,要求对数组不能进行排序,时间复杂度为O(nlog2k)快速排序实现思路:这个链接为 快速排序的原理(从小到大排序) 如果不懂快排建议先看此链接, 题目的要求是找第K大的数,那么我们将快速排序转换为从大到小排序进行分析。 找第k大的数,其实就是找角标k-1的数, 当par 大于k-1 时,那么par的左边有par个大的数 所以在左边进行查找;当par小于k-1...原创 2019-01-19 00:51:36 · 1273 阅读 · 1 评论 -
随笔-最大连续1的个数
题目:给定一个二进制数组, 计算其中最大连续1的个数。示例 1:输入: [1,1,0,1,1,1]输出: 3解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.注意:输入的数组只包含 0 和1。输入数组的长度是正整数,且不超过 10,000。思路:O(n) 解法,设置两个变量,一个记录最大连续1的个数;一个记录当前统计1的个数;进阶:如果数据量足够海量时,我们应...原创 2019-01-14 10:20:11 · 239 阅读 · 2 评论 -
随笔-实现strStr() (找到字符串子串)
题目:实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = “hello”, needle = “ll”输出: 2示例 2:输入: haystack = “aaaaa”, needle = ...原创 2018-12-23 14:55:54 · 493 阅读 · 0 评论 -
随笔-判断一个链表是否为回文链表
问题:请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: trueclass Solution { public boolean isPalindrome(ListNode head) { // 要实现 O(n) 的时间复杂度和 O(1) 的空间复杂度,需要翻转后半部分...转载 2018-12-11 16:03:35 · 1188 阅读 · 0 评论 -
随笔-设计循环队列
问题:设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作:MyCir...原创 2018-12-11 11:03:28 · 262 阅读 · 0 评论 -
随笔-KMP算法解决主串(s2)里面有几个子串(s1)
时间复杂度O(n+m)问题:s1=“asc” s2=“ababcdd”思路:KMP不再多说,如果查找到,那就返回的下标+1继续找public class{ public static int [] next(String sub,int [] next){ next[0]=-1; if(next...原创 2018-12-10 20:12:51 · 692 阅读 · 0 评论 -
数据结构-串-KMP算法
时间复杂度:o(m+n)需求:解决字符串是否包含字符字串的问题;思路:定义一个主串的指针i 字串的指针j 当i和j下标的字符相同,i++;j++; 当不同时,从j=0开始找以j-1下标字符结尾的字符真子串,其长度为len, 与j-1下标开始回退len长度的字符真子串进行比较,如相同j=len; 那么我们有必要设置字串的next[] 数组保存当前元素如果与主串不同时,len的长...原创 2018-12-10 16:36:10 · 629 阅读 · 0 评论 -
数据结构-串- BF(朴素)算法
时间复杂度: O(nm) ;需求:解决字符串主串是否包含子串的问题;思路:采用双指针;主串i 字串 j 当i与j相同时 i++,j++,如不同,j=0; i回退上次开始比较的的位置+1 匹配成功返回第一个字符的下标;class BF{ public static int bf(String str,String sub){ ...原创 2018-12-10 13:59:08 · 210 阅读 · 0 评论 -
随笔-(基本类型/泛型)两个栈实现一个队列
问题:两个栈实现一个队列思路:栈是先进后出,队列是先进先出,固定栈1为入对,栈2为出对;需要出队时,如果栈二为空,就把栈1元素导入栈二,然后出队,不为空直接出栈二元素;基本数据类型实现public class QueueDemo { public static void pushQueue(Stack s1,int val){ // 入队 s1.push(val);...原创 2018-12-10 11:47:31 · 316 阅读 · 0 评论 -
随笔-两个队列实现一个栈
问题:两个队列实现一个栈思路:队列是先进先出,栈是先进后出。如果要pop栈顶元素,那么需要pop的队列中只能有一个元素,那就需要将其余的元素pop到另一个队列当中;也就是说,队列当中需要保持一个队列为空;class Queue{ private int front; //要出元素下标 private int rear ; //要push的位置下标; ...原创 2018-12-10 11:29:00 · 156 阅读 · 0 评论 -
数据结构-排序-堆排序(heapSort)
算法:(只支持从小到大排序)已知父,推子:左孩子(2n+1) ; 右孩子(2n+2) ;已知子,推父:子为n ,父为(n-1)/2;步骤: 建立大根堆>>> 不断地调整 交换–>>调整...原创 2019-01-10 10:26:53 · 513 阅读 · 0 评论