
算法
文章平均质量分 77
幺幺满地乱爬
这个作者很懒,什么都没留下…
展开
-
串联所有单词的子串c++/java实现
今天刷到了这道题,算是滑动窗口和哈希结合,很标准的能够锻炼优化思路的题,下面写一下自己的解体思路。给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/substring-with-concatenation-of-all原创 2021-03-17 20:32:33 · 279 阅读 · 0 评论 -
无重复字符的最长子串Java实现
无重复字符的最长子串Java实现今天碰到了无重复字符的最长子串这道题,看到了一个很巧妙的算法实现,整理一下自己学习后的想法和做题时的思路思路:首先就看一下这个问题的状态空间是怎么样的,这个问题的目标是找到最长的那个子串的长度,那么最终的状态变化就是长度这个数值,而决定着长度的维度变量有2个下标,一个start一个end分别代表当前所见的字符串的起始位置和结束为止,我们在不断改变start和end的位置时寻找出最为标准的length进行保存。下面可以画出最原始的状态元组了(length,start,end原创 2021-03-03 22:37:30 · 415 阅读 · 1 评论 -
动态规划股票题(全)
121:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?public int maxProfit(int[] prices) { if(prices.length==0) return 0; int[] dp = new int[prices.length]; int min = prices[0]; for(int i=1;i<prices.length;i++){ min = min<pri原创 2020-10-05 11:35:27 · 793 阅读 · 0 评论 -
动态规划Java实现详解
首先贴出一个例题:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?这道题时leecode70题,是一个简单并且经典的动态规划。来分析一下这道题,我们每一次上台阶都有两个选择,上一级和上两级台阶,这里很明显我们的决策可以画出一个二叉树,我们每一次决策都与前一次决策有关,而我们的爬楼梯的方法数就应该是这颗二叉树的叶子结点的个数。我手画了一下这个树,这里n是4那么深度优先遍历应该就可以解决这个问题,但是这样我们就会有很多重复的子树原创 2020-09-19 14:39:52 · 765 阅读 · 1 评论 -
摆渡的士兵算法设计与分析
算法分析与设计基础4.1题package suanfa3;/** * n个士兵组成的小分队必须越过一条又深又宽,又没有桥的河。他们注意到在岸边有两个十二岁大的小男孩在玩划艇。 * 然而船非常小,只能容纳两个男孩或者是一个士兵。 * 怎样才能让士兵渡过河并且留下两个男孩共同操作这条船? * 这条船要与岸之间横渡多少次? * * 当n=1时 * 1。两个个孩子过去 * 2。一个孩子回来 * 3。士兵过去 * 4。一个孩子回来,此时两个孩子都在有船的岸边 * 可以推断出f(n) = f原创 2020-09-09 10:53:10 · 1729 阅读 · 1 评论 -
子字符串暴力匹配 Java的两种实现与原理
子字符串的暴力匹配的思路就是双指针,一个指针指向原串,另外一个指向模式串。近当指向模式串的指针走到了模式串的末尾代表在原串中找到了匹配的模式串。返回。下面的两种实现原理一样,第一个是双指针双循环,外循环代表目前在原串匹配的起始位置,内循环则是真正的在匹配,如果内循环匹配成功则返回,失败就退回到外循环这时外指针向下走一位,进行下一次匹配。第二个则是,去掉了内循环直接进行匹配如果匹配失败则会回退代码:/** * 子字符串暴力匹配 */public class suanfa14 { pu原创 2020-09-04 09:14:25 · 324 阅读 · 1 评论 -
低位字符优先算法 Java的实现及原理
低位字符优先算法的基础就是键索引计数法,他的思想是从后往前对每一个字符为键都进行键索引计数排序,直到当前所选择的键为第一个字符,这样就要求全部字符串的比较部分一定是连续且相等长度的。思路:1.在外部定义一系列变量,一个字符串数组AUX用于缓存和 回写。一个R作为count数组的键位。一个index作为当前key在string中的索引位置。2.循环递增index,进入循环进行一次键索引计数排序3.在index=string的最开头一个char时做最后一次循环出来后结束循环。这样看起来似乎没有什么道理原创 2020-09-04 08:20:09 · 271 阅读 · 1 评论 -
键索引计数法 Java的实现与思路
对于字符串的排序,不同与之前所学的值得排序,字符串的比较更为复杂,这里先学习一个基础算法叫做索引计数法,他是lfs和mfs的实现基础。这个算法要求我们可以获取目标的键并按照这个键来排序。此时我们有数据如下:值 键abc 2cba 1cca 3cas 2sas 1sss 3我们想要按照键调整数组的顺序思路:1.我们建立一个count数组用来记录每个键(键与count的索引一一对应)所对应元素的数量,2.此时我们count数组中进行累加操作,那么此时count中记录的就是目标元素的起原创 2020-09-03 11:33:47 · 296 阅读 · 0 评论 -
快速排序 Java的实现与思路
快速排序与归并排序类似,只不过他是在不断的寻找数组中的基准位置(基准位置左边的元素比基准小右边的比基准大),在以基准为中点对左和右两个数组去找基准直到当前层的数组达到最小,那么此时数组每个位置都满足基准位置那么数组已经排序成功。代码:public class suanfa4 { public static void main(String[] args) { int[] ints = {1,1,5,3,2,5,4,8}; quicklySort(ints,0,i原创 2020-09-03 11:22:38 · 161 阅读 · 0 评论 -
希尔排序 Java的实现与思路
希尔排序的思路建立在插入排序之上,插入排序可以看我之前写的插入排序的博客。希尔排序是为了解决插入排序时间复杂度过大的解决方案。我们了解过插入排序,这种算法如果在数组大部分有序的情况下时间复杂度可以到达线性增长。而希尔排序就是先对数组实现h有序,这个h有序意思就是在h个位之间的数组是有序的我们只要不断的缩小这个h那么当h=1时数组就变成了完全有序,而且我们在比较时跳跃h个位,可能会减少比较的次数。思路:1.与插入排序相同在仅有一个元素在左时他是有序的2.这时我们根据h的大小拿取index+h位置的元素原创 2020-09-03 11:16:32 · 146 阅读 · 0 评论 -
归并排序 Java的实现与思路
归并排序的思路来自于分治思想,不断的对目标数组进行分割使分割后的数组最终进入到有序状态,在从下到上对已经有序的数组进行合并,并排序使合并后的数组依旧有序。直到最后合并为一个完整的数组。在这种思路下很自然的就会想到递归,因为我们的分解操作要保证在合并操作之前,而切要确定在下级数组有序时执行合并并排序的操作使当前数组有序在被上级数组察觉重复此操作,而这两种操作又都是要循环多次,但是他们之间又有一个判断存在,这样递归这种中断当前栈桢去开辟新的一摸一样的栈桢的操作就很符合我们的需要。思路:1.首先我们要根据当原创 2020-09-03 11:05:33 · 185 阅读 · 1 评论 -
选择排序 Java的实现与思路
选择排序与插入排序类似都是1空间复杂度并且时间复杂度位N平方的排序算法(插入算法在最差情况时才是N平方),他们在处理小规模的数据时效率不错。选择排序的思路就是,不断的找出最小或者最大的元素放在他所应该存在的位置(index)。保证在index前的元素都是有序的并不断增加index的位置数学归纳法来看:1.当仅有一个元素时,他就是最小的2.不断的对index后的全部元素进行遍历找出最小或者最大的与index位置的元素交换位置,这样保证了每一次循环前0到index-1的元素都是有序的。3.在index原创 2020-09-03 10:48:40 · 197 阅读 · 0 评论 -
插入排序 Java的实现与思路
插入排序是一种N的平方复杂度的排序算法。在处理小批次的数据时很好用。插入排序的思路就是,找一个分割线,将这个分割线不断的向后移动,同时保证分割线前面的元素都是排好序的。这样移动到末尾时就讲全部的元素排好序了。根据数学归纳法来看:1.在仅一个元素时,是有序的2.我们不断的对索引位N(大于1)的元素与前面的元素比较找到他所应该在的位置插入进去。这样就可以保证在下一次移动N时0到N-1 的元素都是有序的3.一直当N==数组长度时结束循环这样就可以将元素排序,并且没有使用多余的缓存数组。代码如下:原创 2020-09-03 10:40:32 · 218 阅读 · 0 评论