- 博客(11)
- 收藏
- 关注
原创 单调栈结构进阶问题
给定一个可能含有重复值的数组 arr,找到每一个 i 位置左边和右边离 i 位置最近且值比 arr[i] 小的位置。返回所有位置相应的信息。**与上一个单调栈问题一样。只不过这次在单调栈中存的不是数字。而是数组,其具体代码如下所示:在牛客上跑了一下只有75%;import java.util.*;import java.util.Arrays;public class Main{ public static void main(String [] args){ Scann
2020-09-01 21:12:54
217
原创 单调栈结构
单调栈结构给定一个不含有重复值的数组 arr,找到每一个 i 位置左边和右边离 i 位置最近且值比 arr[i] 小的位置。返回所有位置相应的信息。思路单看这个题目不做其他限制,很容易写出O(N平方)的思路,但这显然是不能满足大家的需求的,因此需要借助一个辅助结构,单调栈。可以实现O(N)的时间复杂度。具体步骤如下:1、当前栈为空时,遍历当前数组,push进去第一个数的索引;2、当前栈不为空时,单调栈,顾名思义,这里需要严格单调,即栈中索引所代表的数从栈顶到栈底是严格递减,当若当前获得索引所代表
2020-08-26 21:55:18
180
原创 生成窗口的最大值数组
import java.util.*;public class Main{ public static void main(String [] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int w = sc.nextInt(); int [] arr = new int[n]; for(int i=0;i<n;i++){
2020-08-26 20:41:38
160
原创 改编汉诺塔问题
改编汉诺塔问题汉诺塔问题比较经典,这里修改一下游戏规则:现在限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间。求当塔有n层的时候,打印最优移动过程和最优移动总步数。第一种使用递归的方式进行解题递归的方式,首先要找到递归的截止点,显然,改题目的截止点就是当我们只剩下一层的时候有多少种情况。当只有一层时有如下情况需要考虑:1、左中、中左、中右、右中2、左右、右左其代码片段如下所示: public static int getNumberProcess(
2020-08-23 18:42:11
514
原创 用一个栈实现另一个栈的排序
用一个栈实现另一个栈的排序思路构建一个辅助栈,当前栈的栈顶元素小于等于辅助栈的栈顶元素时,将当前栈的栈顶元素压入辅助栈;当前栈的栈顶元素大于辅助栈的栈顶元素时,将辅助栈的栈顶元素压入当前栈,直到当前栈的栈顶元素小于辅助栈的栈顶元素时,将其压入辅助栈。循环往复,知道当前栈为空,最后将辅助栈的元素压入当前栈。**import java.util.*;public class Main{ public static void main(String [] args){ Scan
2020-08-18 21:33:00
106
原创 仅用递归和栈操作逆序一个栈*
仅用递归和栈操作逆序一个栈思路通过一个递归函数获得栈最下面的元素并将其移除,最终不断获得剩余的最下面元素,再通过递归将这些元素压回去,得到一个逆序的栈。代码如下:import java.util.*;public class Main{ public static void main(String [] arg){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int
2020-08-15 16:19:03
118
原创 由两个栈组成的队列
由两个栈组成的队列思路两个栈,一进一出,即可实现队列的先进先出功能。但有三个点需要注意:1.输入栈中的元素导入输出栈时要将当前输入栈内所有元素丢入输出栈;2.当输出栈中有元素存在时,不能将输入栈元素导入输出栈;3.将输入栈元素导入输出栈可以写成一个方法,在队列的add、peek、poll方法中调用即可具体Java代码如下:import java.util.*;public class Main{ private Stack<Integer> s1; pri
2020-08-15 15:06:10
90
原创 设计一个有getMin功能的栈结构
设计一个有getMin功能的栈结构思路使用两个普通的栈结构进行实现,获取栈中最小元素的时间复杂度为一两个栈,一个s1存放全部元素,另一个s2存放当前栈中的最小元素push操作时,先判断s2是否为空,若为空或者当前压入栈的数比s2栈顶的数字要小,则直接push,否则不进行操作。而s2则直接进行push操作即可。pop操作时,先判断s1是否为空,若为空则两个栈都没有元素存在,不为空则则pop出s1的栈顶元素,并判断是否与s2栈顶元素相等,若相等,s2也进行pop操作。getMin操作时,则判
2020-08-15 14:26:44
84
原创 Manacher算法讲解与Java实现
Manacher算法原理该算法原型就是求解字符串中的最长回文子串,字符串的长度可能是技术或者偶数,所以首先要对字符串进行填充,例如“abc”变为“#a#b#c#”。算法中的三个要素1)回文半径数组(以当前字符为中心所形成回文字符串的半径大小所组成的数组)2)最右回文右边界(以当前字符为中心所形成回文字符串的最右边的字符的位置)3)回文右边界的中心如何求解回文半径数组如果对...
2018-12-07 21:56:39
235
原创 leetcode890 Java实现
leetcode890 Java实现题目思路想办法找个每个字符相对应的映射关系,在这里我把每个字符都映射成不同的数字,每个字符都对应一个数字,若目标字符串的字符对应的数字与输入字符串数组中的字符对映数字相等,则该字符串符合要求。Codeclass Solution {public List findAndReplacePattern(String[] words, Str...
2018-11-29 17:06:21
185
原创 Leetcode28 Java实现
Leetcode28 Java实现代码实现(kmp)class Solution { public int strStr(String haystack, String needle) { if(needle.length()<1){ return 0; } ...
2018-11-23 16:20:32
292
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人