数据结构
雷金
这个作者很懒,什么都没留下…
展开
-
单调栈结构进阶问题
给定一个可能含有重复值的数组 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 · 230 阅读 · 0 评论 -
单调栈结构
单调栈结构给定一个不含有重复值的数组 arr,找到每一个 i 位置左边和右边离 i 位置最近且值比 arr[i] 小的位置。返回所有位置相应的信息。思路单看这个题目不做其他限制,很容易写出O(N平方)的思路,但这显然是不能满足大家的需求的,因此需要借助一个辅助结构,单调栈。可以实现O(N)的时间复杂度。具体步骤如下:1、当前栈为空时,遍历当前数组,push进去第一个数的索引;2、当前栈不为空时,单调栈,顾名思义,这里需要严格单调,即栈中索引所代表的数从栈顶到栈底是严格递减,当若当前获得索引所代表原创 2020-08-26 21:55:18 · 194 阅读 · 0 评论 -
生成窗口的最大值数组
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 · 176 阅读 · 0 评论 -
改编汉诺塔问题
改编汉诺塔问题汉诺塔问题比较经典,这里修改一下游戏规则:现在限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间。求当塔有n层的时候,打印最优移动过程和最优移动总步数。第一种使用递归的方式进行解题递归的方式,首先要找到递归的截止点,显然,改题目的截止点就是当我们只剩下一层的时候有多少种情况。当只有一层时有如下情况需要考虑:1、左中、中左、中右、右中2、左右、右左其代码片段如下所示: public static int getNumberProcess(原创 2020-08-23 18:42:11 · 539 阅读 · 0 评论 -
用一个栈实现另一个栈的排序
用一个栈实现另一个栈的排序思路构建一个辅助栈,当前栈的栈顶元素小于等于辅助栈的栈顶元素时,将当前栈的栈顶元素压入辅助栈;当前栈的栈顶元素大于辅助栈的栈顶元素时,将辅助栈的栈顶元素压入当前栈,直到当前栈的栈顶元素小于辅助栈的栈顶元素时,将其压入辅助栈。循环往复,知道当前栈为空,最后将辅助栈的元素压入当前栈。**import java.util.*;public class Main{ public static void main(String [] args){ Scan原创 2020-08-18 21:33:00 · 114 阅读 · 0 评论 -
仅用递归和栈操作逆序一个栈*
仅用递归和栈操作逆序一个栈思路通过一个递归函数获得栈最下面的元素并将其移除,最终不断获得剩余的最下面元素,再通过递归将这些元素压回去,得到一个逆序的栈。代码如下: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 · 130 阅读 · 0 评论 -
由两个栈组成的队列
由两个栈组成的队列思路两个栈,一进一出,即可实现队列的先进先出功能。但有三个点需要注意:1.输入栈中的元素导入输出栈时要将当前输入栈内所有元素丢入输出栈;2.当输出栈中有元素存在时,不能将输入栈元素导入输出栈;3.将输入栈元素导入输出栈可以写成一个方法,在队列的add、peek、poll方法中调用即可具体Java代码如下:import java.util.*;public class Main{ private Stack<Integer> s1; pri原创 2020-08-15 15:06:10 · 105 阅读 · 0 评论 -
设计一个有getMin功能的栈结构
设计一个有getMin功能的栈结构思路使用两个普通的栈结构进行实现,获取栈中最小元素的时间复杂度为一两个栈,一个s1存放全部元素,另一个s2存放当前栈中的最小元素push操作时,先判断s2是否为空,若为空或者当前压入栈的数比s2栈顶的数字要小,则直接push,否则不进行操作。而s2则直接进行push操作即可。pop操作时,先判断s1是否为空,若为空则两个栈都没有元素存在,不为空则则pop出s1的栈顶元素,并判断是否与s2栈顶元素相等,若相等,s2也进行pop操作。getMin操作时,则判原创 2020-08-15 14:26:44 · 100 阅读 · 0 评论