算法学习
文章平均质量分 51
大王我亲自来巡山
这个作者很懒,什么都没留下…
展开
-
AC算法(自学过程详细讲解,方便大家理解)
Aho-Corasick自动机算法,简称就叫做AC算法。网上看了各种各样的AC算法,其实都看的不太理解。最后还得导师亲自给我讲解了前因后果,才能真正理解了。刚刚从经历了懵逼到理解的过程,我得赶紧记录下我理解此算法的过程,相信很多刚刚看此算法的同学们,应该会有很多和我一样的问题。首先,先讲述一下此算法的作用是什么,为什么要用AC算法,什么时候用?AC算法主要是解决多字符串匹配问题,比如字符串us...原创 2019-03-18 17:02:14 · 20623 阅读 · 7 评论 -
LeetCode算法两数之和Java详解(第一题)
LeetCode算法两数之和Java详解(第一题)题目要求:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]以上是力扣中的原话,要求其实有点绕,其实就是告诉你有个数组,现在已知数组中两原创 2020-06-18 18:03:02 · 231 阅读 · 0 评论 -
LeetCode无重复字符的最长子串Java(最容易理解的滑动窗口回溯过程)
题目要求:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。题目原创 2020-06-20 12:46:54 · 308 阅读 · 0 评论 -
KMP算法思想图解(超简单一图看懂)
KMP算法(个人从懵逼到理解过程详解)首先要知道,KMP是解决字符串匹配问题的,是在暴力匹配的基础上进行优化。所谓暴力匹配,就是长串与短串之间挨个字符对比,当出现不匹配时,短串向后后移一位,再次从头匹配。而KMP算法,就是在对此进行优化:当出现不匹配时,是否可以多往后移动,从而减少不必要的比较过程。说到KMP算法,网上各种大神,各种详解,上来先讲KMP是干嘛的,然后就直接讲怎么求next数组,然后当出现不匹配时,代入next数组,成功跳转。我:???就我个人学习过程来说,最需要的是理解next数组是干原创 2020-09-18 19:12:54 · 935 阅读 · 3 评论 -
Java实现快速排序,深入解释为什么从右边开始
先讲一下快排的思想:先抓取数组第一个数,记为key,一趟排序后,将这个数放在最终位置,也就是说,第一趟排序后,这个数左边都是比它小的数,右边都是比它大的数。例如:2,1,4,3抓取第一个数2,记为key,一趟排序后,2放在第二个位置:1,2,4,3此时,2的左边都比它小,右边都比它大。此算法需要两个指针,分别从最左边和最右边开始向中间遍历。如果抓取最左边的数作为key,那么,需要先从右边的指针往中间遍历,遇到比key小的数停下,然后左边的指针开始从左向右遍历,遇到比key大的数停下,然后左右指针的原创 2020-10-18 10:33:54 · 1054 阅读 · 5 评论 -
Java实现单链表反转(头插法就地反转)
此算法题,需要在纸上演算一下,画一个单链表,然后用头插法模拟链表反转,所谓头插法,就是有一个头指针,一直指向头结点。我尝试过两个指针,发现做不到,头插法必须要有三个指针,一个是头指针,一直指向头结点,另外一个指针指向要断开节点的前一个,最后一个指向要断开节点的后一位。代码:public static void main(String[] args) { //头插法就地反转 LinkNode node=new LinkNode(1); node.next=new LinkNode(2);原创 2020-10-18 17:09:00 · 695 阅读 · 0 评论 -
斐波那契数列Java
数列:0,1,1,2,3,5,8,13…其实就是每一个数都等于前面两位的和简单思路就是递归,输入n,就是斐波那契的第n位的值,然后当递归到n时,递归结束,输出第n位的值。代码:public static int n=2;//出门ab就有两位了,因此n初始为2 public static void main(String[] args) { int num=6; int result=feiBoNaQi(num,0,1); System.out.println(result); }原创 2020-10-18 17:19:49 · 204 阅读 · 0 评论 -
奇数在偶数前面
算法要求:随机给定一个整数数组,设计一个算法,使得数组中奇数都位于偶数前面,并且奇数和偶数的相对位置不变。思路很简单,先遍历一遍数组,计算出有多少个奇数,奇数+1就是偶数开始存放的位置,然后,创建一个新数组,然后,再遍历一遍数组,遇到奇数就从头添加进新数组,遇到偶数,之前计算出的偶数位置往后添加。代码:public static void main(String[] args) { //随机给定一个整数数组,设计一个算法,使得数组中奇数都位于偶数前面,并且奇数和偶数的相对位置不变 int[]原创 2020-10-18 17:42:33 · 259 阅读 · 1 评论 -
三元组a+b+c=0算法(三数相加)
题目:给定一个乱序数组 {-1, 0, 1, 2, -1, -4},寻找 a + b + c = 0的三元组。并去重。思路:一,先排序,从小到大。二,定义三个指针,第一个a,指向数组第一个位置,第二个b,指向第二个位置,第三个c,指向最后一位。三,然后,计算a+b+c,看是否等于0。1.如果等于0,将结果放入set中保存,然后a不动,b往右移动一位,c往左移动一位,继续计算a+b+c。2.如果小于0,则b往右移动一位,继续计算a+b+c。3.如果大于0,则c往左移动一位,继续计算a+b+c。原创 2020-10-22 23:20:27 · 2156 阅读 · 0 评论 -
递归实现反转栈Java
烧脑提醒!烧脑提醒!烧脑提醒!不皮了,下面开始正题。题目要求:用递归实现栈反转。我走的弯路:首先,我刚开始的想法,我觉得,递归其实本质也是个栈类型的数据结构,所以可以利用递归过程的栈来实现反转。其实,这个思路有问题,因为你递归的过程中,其实也是在出栈操作,当你递归到栈底时,此时,递归函数中最后一个值也是栈底元素,此时,再入栈,其实又原路返回了,所以,必须在此基础上,再递归一次,我看到网上有这种解法,太恶心了,两个递归嵌套。其实这种解法并不是此题的本意,此题的本意是考查对递归思想的深入理解。我的解法原创 2020-10-24 18:02:10 · 567 阅读 · 1 评论 -
用一个栈对另一个栈排序Java实现
题目要求:给定一个栈,让你用一个辅助栈对其元素进行排序。思路:设原始栈为s,辅助栈为helper。1.s出栈栈顶元素,记为pop。2.用pop和helper的栈顶元素比较,若helper为空,或者pop小于等于helper栈顶元素,就直接让pop入栈helper。(这一步相当于,若pop小于helper栈顶元素,pop直接入栈)若执行了这一步,则3、4不用执行,再次从第一步继续执行。3.若pop大于helper栈顶元素,则就让helper栈顶元素出栈并入栈s。(这一步相当于,若pop大于helpe原创 2020-10-25 10:04:48 · 198 阅读 · 0 评论 -
Java实现生产者消费者问题(信号量机制)
首先,先讲一下生产者消费者问题的本质,其实就是同步和互斥的问题。所谓同步问题,其实这个名词,容易让人迷惑,同步,是同时的意思吗?其实不是,反而是不同时的意思。同步问题,其实就是一前一后的问题,某个进程或者程序,必须在另一个的前面或者后面执行,他俩不能同时执行,就是这个意思。如果说同步是对进程或者程序的执行顺序的规定。那么互斥问题,其实更多是对某个资源的规定,即某个资源不能同时被两个进程占用。就比如说生产者消费者问题中,生产者占用缓冲区往缓冲区放产品的时候,消费者就不能用缓冲区,此时,缓冲区对生产者和消费原创 2020-11-02 10:47:26 · 1956 阅读 · 0 评论 -
Java交替打印奇偶数
这个算法需要解决两个问题:怎么实现交替打印?怎么实现奇偶数?算法一:(互斥实现)用一个自增的数,依次对2取余,来实现奇偶数。然后,用信号量(信号量底层用原语实现互斥同步,很方便,大家可以去了解一下,不过这里就是实现互斥,可以理解为就是一个锁)来实现互斥操作,即实现交替打印。具体思路:定义一个互斥信号量,初值为1,为了实现互斥操作。定义一个num变量,从1开始,依次增加,每次对2取余,如果是奇数,就进入奇数的线程,然后,拿到互斥锁,此时信号量为0,偶数线程拿不到锁,等待。打印完奇数,然后num++,释放锁原创 2020-11-02 11:25:25 · 854 阅读 · 0 评论 -
括号匹配深度(爱奇艺18年秋招Java题)
题目:1、空串是一个合法括号匹配序列,且深度为02、如果x和y是合法序列,则xy也是合法序列,且深度为max(x,y)3、如果x是合法序列,则(x)也是合法序列,、且深度比x加1例如:()()()的深度为1,(())的深度为2,(())()的深度为2。题目给出一个括号序列,然后输出最大匹配深度。思路:首先,设置个值max,从头遍历,遇到"(“就max加1。设置一个布尔值,初始为true,当遇到”)",时,设为false,这个布尔变量的作用,是用来标记,一个旧的重叠的括号序列是否结束,用来判断后原创 2020-11-02 12:03:05 · 263 阅读 · 0 评论 -
用数组实现栈Java
用数组实现栈的数据结构,实现入栈,出栈,查看栈顶元素,判空,长度等方法,还要考虑扩容问题。代码:public class MyStackByArray { //数组默认长度为10,超出长度就扩容为2倍 private int maxSize=10; private Object[] arr=new Object[maxSize]; //栈顶指针,-1标志栈空 private int pointer=-1; //入栈 public void push(Object o) { //原创 2020-11-02 16:46:15 · 93 阅读 · 0 评论 -
两个栈实现队列Java
这题其实很容易,就讲个思路吧。先把元素入栈一个栈1,然后,再把这个栈1中所有元素出栈到另一个栈2,此时,栈1的栈底元素就到栈2的栈顶了,再对栈2出栈就是先进先出了。不过。此题需要注意的一点就是,如果此时再进行入队列操作,只能对栈1入栈,并且,如果栈2不为空的话,是不能将栈1中元素入栈栈2的,不然就会出错,就不是先进先出了,这个细节需要注意一下。代码就不贴了,这题太简单了,就是简单出栈入栈而已,注意一下这个细节就行了。...原创 2020-11-02 17:55:33 · 64 阅读 · 0 评论 -
最长回文子串Java
题目:给出一个字符串,找出其中最长回文子串。例如:babad中,最长回文子串有两个bab和aba。思路:我的思路比较简单,就是以某一个字符为中心,依次向两边扩展,看两边的字符是否相同,相同的话,就继续往两边扩展;不等同,则停止,或者遇到边界就停止。从字符串的第二位到倒数第二位依次选为中心进行遍历。用一个map保存结果,key为长度,value为该长度的回文串数组,最后输出map中key长度最长的回文串即可。Java代码:public static void main(String[] args) {原创 2020-11-04 10:47:15 · 358 阅读 · 0 评论 -
LeetCode(力扣)主要元素算法的最优解之摩尔投票法Java代码
题目要求:数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。示例 1:输入:[1,2,5,9,5,9,5,5,5]输出:5示例 2:输入:[3,2]输出:-1示例 3:输入:[2,2,1,1,1,2,2]输出:2说明:你有办法在时间复杂度为 O(N),空间复杂度为 O(1) 内完成吗?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-majority-element-lcci原创 2020-12-15 11:31:02 · 255 阅读 · 0 评论 -
LeetCode(力扣)之转置矩阵(二维数组行列长度获取方式)
题目描述:给定一个矩阵 A, 返回 A 的转置矩阵。矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。示例 1:输入:[[1,2,3],[4,5,6],[7,8,9]]输出:[[1,4,7],[2,5,8],[3,6,9]]示例 2:输入:[[1,2,3],[4,5,6]]输出:[[1,4],[2,5],[3,6]]思路:简单题,确实很简单,题目要求其实就是把一个多维数组的行列反转,行变成列,列变成行。因此,思路为,先获取原数组的行数和列数,然后,创建一个新多维数组,新数组的原创 2020-12-16 10:50:13 · 428 阅读 · 0 评论 -
LeetCode(力扣)有序数组的平方之双指针解法Java
题目要求:给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例 1:输入:[-4,-1,0,3,10]输出:[0,1,9,16,100]示例 2:输入:[-7,-3,2,3,11]输出:[4,9,9,49,121]思路:观察题目,可以发现,因为已知数组是升序排列的,那也就是说,当原数组平方后,以0为中心,之前的负数部分是降序排列的,之前的正数部分仍然是升序排列。这也就相当于,平方后,数组变成了两头大中间小的情况,并且是依次从两头往中间递减,因原创 2020-12-16 12:13:49 · 156 阅读 · 0 评论 -
LeetCode(力扣)三个数的最大乘积,详细分析一遍扫描法Java
题目要求:给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。示例 1:输入: [1,2,3]输出: 6示例 2:输入: [1,2,3,4]输出: 24注意:给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。算法思路:三个数,从排列组合来看,顶多也就那这几种情况:三个数全正,三个数全负,两正一负,两负一正。好的,那就来分析这四种情况,其中,三数全负数和两正一负的三数原创 2020-12-17 12:44:29 · 582 阅读 · 0 评论 -
LeetCode(力扣)汇总区间(提高对Java中String效率的理解)
题目要求:给定一个无重复元素的有序整数数组 nums 。返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。列表中的每个区间范围 [a,b] 应该按如下格式输出:“a->b” ,如果 a != b“a” ,如果 a == b示例 1:输入:nums = [0,1,2,4,5,7]输出:[“0->2”,“4->5”,“7”]解释:区间范围是:[0,2]原创 2020-12-21 12:16:16 · 126 阅读 · 0 评论 -
LeetCode(力扣)数组序号转换算法(map的理解)
题目要求:给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。序号代表了一个元素有多大。序号编号的规则如下:序号从 1 开始编号。一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。每个数字的序号都应该尽可能地小。示例 1:输入:arr = [40,10,20,30]输出:[4,1,2,3]解释:40 是最大的元素。 10 是最小的元素。 20 是第二小的数字。 30 是第三小的数字。示例 2:输入:arr = [100,100,100]输出:[1原创 2020-12-24 12:23:35 · 388 阅读 · 0 评论 -
LeetCode(力扣)拼写单词(把字符asc码映射到数组下标解决)Java
题目要求:给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。返回词汇表 words 中你掌握的所有单词的 长度之和。示例 1:输入:words = [“cat”,“bt”,“hat”,“tree”], chars = “atach”输出:6解释:可原创 2020-12-25 11:01:38 · 167 阅读 · 0 评论 -
LeetCode(力扣)至少是其他数字两倍的最大数(一遍扫描法)
题目要求:在一个给定的数组nums中,总是存在一个最大元素 。查找数组中的最大元素是否至少是数组中每个其他数字的两倍。如果是,则返回最大元素的索引,否则返回-1。示例 1:输入: nums = [3, 6, 1, 0]输出: 1解释: 6是最大的整数, 对于数组中的其他整数,6大于数组中其他元素的两倍。6的索引是1, 所以我们返回1.示例 2:输入: nums = [1, 2, 3, 4]输出: -1解释: 4没有超过3的两倍大, 所以我们返回 -1.提示:nums 的长度范围在原创 2020-12-25 11:46:35 · 115 阅读 · 0 评论 -
力扣LeetCode第k个缺失的正整数
题目要求:给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。请你找到这个数组里第 k 个缺失的正整数。示例 1:输入:arr = [2,3,4,7,11], k = 5输出:9解释:缺失的正整数包括 [1,5,6,8,9,10,12,13,…] 。第 5 个缺失的正整数为 9 。示例 2:输入:arr = [1,2,3,4], k = 2输出:6解释:缺失的正整数包括 [5,6,7,…] 。第 2 个缺失的正整数为 6 。思路:直接上最优思路,观察题目要求,所谓缺失的原创 2020-12-27 18:37:03 · 227 阅读 · 0 评论 -
力扣LeetCode按奇偶排序(双指针法)Java
题目要求:给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。你可以返回任何满足上述条件的数组作为答案。示例:输入:[4,2,5,7]输出:[4,5,2,7]解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。思路:双指针法,维护两个指针,一个even指针,表示偶数,一个odd指针,表示奇数。even指针一直指向偶数下标,并判断数组的偶数下标里的数是否真原创 2020-12-28 09:30:21 · 237 阅读 · 0 评论 -
力扣LeetCode之替换所有的问号Java
题目要求:给你一个仅包含小写英文字母和 ‘?’ 字符的字符串 s,请你将所有的 ‘?’ 转换为若干小写字母,使最终的字符串不包含任何 连续重复 的字符。注意:你 不能 修改非 ‘?’ 字符。题目测试用例保证 除 ‘?’ 字符 之外,不存在连续重复的字符。在完成所有转换(可能无需转换)后返回最终的字符串。如果有多个解决方案,请返回其中任何一个。可以证明,在给定的约束条件下,答案总是存在的。示例 1:输入:s = “?zs”输出:“azs”解释:该示例共有 25 种解决方案,从 “azs” 到原创 2020-12-29 11:12:58 · 241 阅读 · 2 评论 -
力扣leetCode459之重复的子字符串(双倍字符串解法)Java
题目描述:给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例 1:输入: “abab”输出: True解释: 可由子字符串 “ab” 重复两次构成。示例 2:输入: “aba”输出: False示例 3:输入: “abcabcabcabc”输出: True解释: 可由子字符串 “abc” 重复四次构成。 (或者子字符串 “abcabc” 重复两次构成。)思路:这题其实就是让你判断一个字符串是不是由一个相同原创 2020-12-30 16:45:04 · 443 阅读 · 0 评论 -
KMP算法代码思路,详解next数组的Java代码
KMP算法的思路请参考:kmp思想能理解KMP的思想和能理解KMP代码是两回事,很多时候我们理解了思想,却看不懂代码实现,本篇博客主要是记录代码实现KMP的思路。KMP算法的代码实现中,最重要也是最难理解的,就是next数组,下面直接上图:首先,先假设我们已知了next数组的next[j]=k,意思就是j位置之前,由k-1个相同前后缀接下来,在已知的前提下,推导j+1的情况,如果j向前一位变成j+1,之前的k位置S[k]如果等于S[j],那么next[j+1]=k+1注意:这里是S[k]等于S[原创 2020-12-30 17:59:43 · 465 阅读 · 3 评论 -
数据结构之用对数器验证基础排序(冒泡排序、选择排序、插入排序)
刷力扣的时候,经常可以看到会给出题目的数值范围,数组长度范围和数组中数据的取值范围等等,这些信息其实就是让你自己用对数器验证的。所谓的对数器就是相当于你自己写的随机样本,和一个正确函数比较,如果结果相同,就说明你写的含数没问题。对数器使用:1.生成随机样本,随机样本的参数可以自己设定,一半根据题目要求(testTime:生成随机样本的数量,越多越准确;size:数组长度范围;value:数值范围)2.写一个正确函数,所谓正确函数,就是保证一定正确的函数,不用考虑时间复杂度。如果Java有内置函数最好原创 2020-12-31 12:34:18 · 124 阅读 · 1 评论 -
小和问题与逆序对问题(用递归的归并排序思想解决)
小和问题:在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。例如:1,3,4,23左边1比3小,4左边1、3比4小,2左边1比2小,因此1+1+3+1=6逆序对问题:在一个数组中,左边的数如果比右边的数大,则这两个数构成一个逆序对,请打印一个数组的所有逆序对。思路:明明是小和问题,怎么会和递归实现的归并排序扯上关系呢?下面就先来看一下递归实现归并排序的过程。归并排序,就是将两个有序数组合并。那么归并排序中的为什么用递归?就是因为将数组分为两部分后,这两部分原创 2021-01-01 17:29:17 · 175 阅读 · 0 评论 -
优化快速排序(荷兰国旗问题)JAVA
荷兰国旗问题:给定一个数组和一个数num,请把小于num的数放在数组左边,把等于num的数放在中间,把大于num的数放在数组右边。要求额外空间复杂度O(1),时间复杂度O(n)思路:先定义一个left指针,比原数组arr左边界小1。然后再定义一个right指针,比原数组右边界大1。然后还有一个遍历数组的指针index。然后依次遍历arr[index],如果小于num,则将left加1,然后把left位置的数和index位置交换。这一步是什么意思呢?left的含义就是保存比num小的数的边界,如果in原创 2021-01-04 13:24:15 · 268 阅读 · 0 评论 -
用数组实现堆排序的代码Java版
首先要知道,堆其实就是完全二叉树。所谓完全二叉树,可以理解为,在满二叉树的基础上,可以缺少一些结点,缺少的节点只能从满二叉树的右下角开始缺少。也就相当于从从左到右从上到下开始构建的一棵二叉树,节点只能这样排列,不能跳。那么,根据完全二叉树的特点,父节点的左孩子left=父节点2+1,右孩子right=父节点2+2,父节点=(孩子节点-1)/2。那么,其实完全二叉树就可以放进一个数组中,根据数组下标来表示完全二叉树之间的关系。堆排序大根堆就是每个父节点都比两个孩子节点大。小根堆每个父节点都比孩子节点小。原创 2021-01-05 13:17:50 · 162 阅读 · 0 评论 -
Java对象排序之比较器(数组中的对象排序,堆中的对象排序(优先级队列),红黑树中的对象排序)
Java中的比较器,就是Comparator接口,实现这个接口,并实现compara方法,就能实现比较器。比较器的作用:通常的排序算法一般都是对基本数据类型排序,比如整数浮点数等,但是,如果需要排序的是个对象呢?现在需要根据对象中的某个属性进行排序,怎么实现?这就需要比较器了。比较器例子:举个例子,现在有一个学生对象,学生对象中有姓名、年龄、学号三个属性,现在有一个学生对象的数组,想要对数组中的学生进行排序,根据年龄升序排序。实现Comparator接口并重写compara方法,在compara方原创 2021-01-06 13:04:02 · 296 阅读 · 0 评论 -
用固定数组实现队列的最简单思路Java
用数组实现队列。首先需要:队列头:last指针队列尾:first指针一般思路:按照一般的思路,进队列一个数,first++。出队列一个数last++。当first和last碰头时,需要判断队列为空还是队列满了,当指针大于数组长度时,还需要做取余操作。经典操作中,两个指针之间的关系比较错综复杂。新思路:取一个size来保存当前数组中已经有多少元素。当入队列一个数,first++,同时size++;当出队列一个数,last++,同时size–;相当于,把原本复杂的关系,都和size联系起来了,将fi原创 2021-01-07 15:28:25 · 151 阅读 · 0 评论 -
排序后相邻两数的最大差值(基于桶排序的思路)Java
题目要求:给定一个数组,求如果在排序之后,相邻两数的最大差值,要求时间复杂度 O(n),且不能使用非基于比较的排序(也就是不能用基数排序)思路:这题,要求不能使用基数排序,其实就是在暗示,只有基数排序能够实现。那么,如果不使用基数排序,就可以依靠基数排序的思路进行解题。此题,借鉴桶排序的思路,我们创建N+1个桶来解题。首先,先遍历一遍数组,找出数组中的最大值和最小值。然后,创建N+1个桶,然后,最大值-最小值其实就是所有数的分布区间,将这个区间平均映射到N+1个桶内。因为原数组有N个数,现在却创建原创 2021-01-07 16:59:11 · 722 阅读 · 0 评论 -
两个队列实现栈Java
最基础的题目了,用两个队列实现栈。注意:Java中,其实queue底层就是链表,因此。这样创建队列:Queue<Integer> queue = new LinkedList<>();思路:创建两个队列,一个queue,一个help,每次进栈就进queue,每次出栈时,把queue中前n-1个数倒入help中,然后,出栈queue最后一个数,然后,将help和queue的指针交换,help变成新的queue,queue为空了,就变成help。代码: public原创 2021-01-08 11:26:46 · 131 阅读 · 0 评论 -
二维数组螺旋打印问题和顺时针旋转90°问题(宏观调度问题或者说外圈内圈问题)Java
二维数组螺旋打印问题:就是给你一个二维数组,然后,让你依次顺时针打印出所有数。例如:二维数组1、2、34、5、67、8、9要求打印结果为:1、2、3、6、9、8、7、4、5思路:这题用宏观调度问题来解决,或者说是外圈内圈问题。其实根本还是基于分而治之的思想。首先,如果想一口气解决问题,这是我们一般的常规第一思路,然后开始扣细节,比如每次转折点的坐标变化等等,非常麻烦。其实,后退一步,当我们并不打算一口气解决掉整个问题时,就会发现问题变得轻松了起来。所谓宏观调度,就是让你跳出扣细节的思维误原创 2021-01-11 13:38:38 · 325 阅读 · 0 评论 -
数组Z字型打印(宏观调度问题)Java
题目要求:给定一个数组。请写出Z字形打印的结果。例如:1、2、34、5、67、8、9打印结果为:1、4、2、3、5、7、8、6、9思路:经典宏观调度问题,当Z字形的转折处数组下标很难找到规律时,考虑跳出细节,用宏观来看待问题,那么问题就可以划分为:沿着45°线遍历数组,只不过左下到右上和右上到左下依次循环。具体思路就是,给两个指针A、B。A依次沿着第一行向右跑,到头了就向下跑:1、2、3、6、9B依次沿着第一列向下跑,到头了就向右跑:1、4、7、8、9然后AB之间就维护了所有45°线原创 2021-01-12 11:38:11 · 516 阅读 · 3 评论