leetcode -- 栈

题目1.

https://leetcode.com/problems/gray-code/

题目简介:  输入一个数字表示二进制的位数,输出所有可能,注意相邻的两个二进制数字之间只能差一位,以0为开始。

题解:观察序列变化,发现一个规律,每次都将已有的list翻转然后在最高位上加1,增加进list。 就可以了。

class Solution {
    public List<Integer> grayCode(int n) {
         List<Integer> list = new ArrayList<Integer>();
        
        Stack<Integer> stack = new Stack<Integer>();
        list.add(0);
        
         if(n <= 0)return list;
        
        int t=0;
        while(t<n){
            for(Integer i :list){
                stack.push(i);
            }
            
            while(!stack.isEmpty()){  //利用栈来做翻转
                int val = stack.pop()+(int)Math.pow(2,t);//最高位加1
                list.add(val);
            }
            t++;
        }
        return list;
        
    }
}


题目2 .  重新实现栈能在常数复杂度找到最小值

https://leetcode.com/problems/min-stack/

题目简介:重新实现栈能在常数复杂度找到最小值

题解:用一个栈和一个int min存储。  push的时候若数字小于最小值时先将最小值压栈,然后再将数字压栈 push两次。pop的时候如果取出的数字等于,则最小值需要更新,之前压栈的值取出来作为最小值,相当于pop两次。

也可以用两个栈实现,stack1存数字,stack2实时最小值。  当x 执行push  操作时往数字栈中放数字,如果x小于stack2的peek(),则将x入栈stack2,否则则将stack2的peek()再入一次栈。

class MinStack {
    Stack<Integer> stack;
    int min = Integer.MAX_VALUE;
    /** initialize your data structure here. */
    public MinStack() {
         stack = new Stack<Integer>();
         
    }
    
    public void push(int x) {
        if(x <= min){
            stack.push(min);  //小于最小值时将最小值压栈
            min = x;
        }
        stack.push(x);  //将数字压栈
        
    }
    
    public void pop() {
        if(stack.pop() == min){ //如果取出的数字为最小值,则最小值需要更新,之前压栈的值取出来作为最小值
            min = stack.pop();
        }
        
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int getMin() {
        return min;
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值