题目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();
*/