用2个栈实现队列
题目描述:
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
分析:
栈的特点是先进后出,队列的特点是先进先出。
用2个栈实现队列的功能的话,即一个栈用来存,一个栈用来取出。
思路也很简单,进队列的操作都放入stack1里,需要出队列的话就将stack1的元素出栈放入stack2中,再对stack2进行出栈操作。
代码如下:
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
}
public int pop() {
if (stack2.isEmpty()){
while(!stack1.empty()){
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}
虽然上述代码通过编译了,但是个人觉得还是下面的代码更为严谨些:
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
while(!stack2.isEmpty()){
stack1.push(stack2.pop());
}
stack1.push(node);
}
public int pop() {
if (stack2.isEmpty()){
while(!stack1.empty()){
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}
旋转数组的最小数字
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
分析:抓住题目的细节,非递减排序的数组的旋转,首先非递减排序的性质为 旋转前后形成的2个序列是分别有序的,例如 1235旋转为3512,其12和35是分别有序的。寻找最小的数字其实就是寻找第二个序列的首元素。
官方题解使用的是二分法,因为确实是局部有序,但是二分查找最难确定的是target的选取,本题我一直想使用左端点写,但是发现确实不行,应该用的右端点。