算法练习

六眼飞鱼酱① 提交于 2020-02-04 23:25:17

题目:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

题目分析:需要定义栈数据结构,并提供找出栈内最小元素的min函数,并且时间复杂度O(1)。

思路:借助辅助栈来实现(入栈时:添加的元素小于辅助栈的最顶元素,则入到辅助栈中。出战时:辅助栈和元栈栈顶元素相等则辅助栈出栈。)

对原来栈的封装,使之实现O(1)复杂度的min方法。

 1 import java.util.Stack;
 2 
 3 public class Solution {
 4     //O(1)时间复杂度,借助辅助栈来实现(入栈时:添加的元素小于辅助栈的最顶元素,则入到辅助栈中。出战时:辅助栈和元栈栈顶元素相等则辅助栈出栈。)。
 5     //对原来栈的封装,使之实现O(1)复杂度的min方法。
 6     Stack<Integer> stack1 = new Stack<>(),stack2 = new Stack<>();
 7     public void push(int node) {
 8         stack1.push(node);
 9         if(stack2.empty()){
10             stack2.push(node);
11         }else if(node<stack2.peek()){
12             stack2.push(node);
13         }
14     }
15     
16     public void pop() {
17         if(stack1.peek()==stack2.peek()){
18             stack2.pop();
19         }
20         stack1.pop();
21         
22     }
23     
24     public int top() {
25         return stack1.peek();
26     }
27     
28     public int min() {
29         return stack2.peek();
30     }
31 }

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

思路:利用辅助栈,对入栈序列压栈,判断栈顶元素与出栈元素是否相同,相同则出栈,最后判断栈是否为空。

 1 import java.util.ArrayList;
 2 import java.util.Stack;
 3 public class Solution {
 4     //利用辅助栈,对入栈序列压栈,判断栈顶元素与出栈元素是否相同,相同则出栈,最后判断栈是否为空。
 5     public boolean IsPopOrder(int [] pushA,int [] popA) {
 6         if(pushA.length == 0 || popA.length == 0)
 7             return false;
 8         Stack<Integer> tmp = new Stack<>();
 9         int j=0;
10         for(int i=0;i<pushA.length;i++){
11             tmp.push(pushA[i]);
12             while(!tmp.empty()&&tmp.peek()==popA[j]){
13                 tmp.pop();
14                 j++;
15             }
16         }
17         return tmp.empty();
18     }
19 }

题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。

思路:使用ArrayList模拟队列,先进先出,实现逐层遍历。

 1 import java.util.ArrayList;
 2 /**
 3 public class TreeNode {
 4     int val = 0;
 5     TreeNode left = null;
 6     TreeNode right = null;
 7 
 8     public TreeNode(int val) {
 9         this.val = val;
10 
11     }
12 
13 }
14 */
15 public class Solution {
16     public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
17         /**
18         //逐层遍历
19         if(root == null){
20             return new ArrayList<Integer>();
21         }
22         ArrayList<TreeNode> list = new ArrayList<>();
23         list.add(root);
24         return method(list);
25         **/
26         //使用ArrayList模拟队列,先进先出
27         ArrayList<Integer> list = new ArrayList<>();
28         ArrayList<TreeNode> queue = new ArrayList<>();
29         if(root == null){
30             return list;
31         }
32         queue.add(root);
33         while(!queue.isEmpty()){
34             TreeNode tmp = queue.remove(0);
35             if(tmp.left!=null){
36                 queue.add(tmp.left);
37             }
38             if(tmp.right!=null){
39                 queue.add(tmp.right);
40             }
41             list.add(tmp.val);
42         }
43         return list;
44     }
45     //逐层将TreeNode保存到ArrayList中
46     private ArrayList<Integer> method(ArrayList<TreeNode> floor){
47         ArrayList<Integer> nodelist = new ArrayList<>();
48         if(floor==null||floor.size()==0){
49             return null;
50         }
51         ArrayList<TreeNode> list = new ArrayList<TreeNode>();
52         for(TreeNode node:floor){
53             nodelist.add(node.val);
54             if(node.left!=null){
55                list.add(node.left);
56             }
57             if(node.right!=null){
58                list.add(node.right);
59             }
60         }
61         ArrayList<Integer> tmpList = method(list);
62         if(tmpList!=null)
63             nodelist.addAll(tmpList);
64         return nodelist;
65     }
66 }

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

 1 public class Solution {
 2     public boolean VerifySquenceOfBST(int [] sequence) {
 3         if(sequence==null||sequence.length==0){
 4             return false;
 5         }
 6         if(sequence.length==1){
 7             return true;
 8         }else{
 9             int root = sequence[sequence.length-1];
10             int cut = 0;
11             while(sequence[cut]<root){
12                 cut++;
13             }
14             for(int i=cut;i<sequence.length;i++){
15                 if(sequence[i]<root){
16                     return false;
17                 }
18             }
19             int[] left = new int[cut];
20             int[] right = new int[sequence.length-cut-1];
21             for(int i=0;i<sequence.length-1;i++){
22                 if(i<cut){
23                     left[i] = sequence[i];
24                 }else{
25                     right[i-cut] = sequence[i];
26                 }
27             }
28             if(left.length!=0){
29                 if(right.length!=0){
30                     return VerifySquenceOfBST(left)&&VerifySquenceOfBST(right);
31                 }else{
32                     return VerifySquenceOfBST(left);
33                 }
34             }else{
35                 if(right.length!=0){
36                     return VerifySquenceOfBST(right);
37                 }else{
38                     return true;
39                 }
40             }
41             
42         }
43         
44     }
45 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!