剑指offer
Posted cherry-bail
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer相关的知识,希望对你有一定的参考价值。
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
我的想法:
栈是先进后出,队列是先进先出。两个完全相反的操作,只能将两个栈想象成“倒豆子”,倒来倒去的完成操作。如果想高阶一些的办法,既然有俩个栈,让一个管push另一个负责pop,岂不是有一种自己当老板,因材施教,合理分工的感觉?
但是我一时想不到怎么完美的分工,二时没忍住就看了标准答案~
答案的解析思路如下:
。
一个句号是因为把前面的解析省略了。因为我想给你我的思考。你仔细想想,简单方法下,队列的pop操作需要我们做什么?把队列push到栈1,又把栈1pop出来后push入栈2,此时的栈2是什么??
是一个可以正常pop的队列呀!!分工出来了!
栈1负责push操作,
if 遇到队列的pop:找栈2:
if 栈2非空 ——》 直接pop
if 栈2 == 空 ——》 将栈1内容除了最下面的数据全部push进栈2,将栈1最底的数据pop出来
我们做到了!成功想到了这个最轻便的方法
Stack<Integer> stackIn = new Stack<>();
Stack<Integer> stackOut = new Stack<>();
public void push(int node){
stackIn.push(node);
}
public int pop(){
if(stack1.isEmpty() && stack2.isEmpty())
throw new RuntimeException("Queue is empty!");
if (!stackOut.isempty()){
stackOut.pop();
} else{
int data = 0;
while(!stackIn.isempty()){ //在这里我不知如何让栈内只剩一个元素,如果计算栈内数据量或循环里添加if 好像开销更大,怎么做呢??
data = stackIn.top();
stackIn.pop();
stackOut.push(data);
}
}
return stackOut.pop();
}
问题:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出旋转数组的最小元素。
例如 {3,4,5,1,2}是{1,2,3,4,5} 数组旋转后的样子,1是最小值
想法:永远和第一个数字做对比,比第一个数字大说明在当前mid的右边,从mid+1到high,比第一个数字小说明在low到mid中。
public int searchMin(int [] array){
int root = array[0];
int low = 1
int high = array.length -1;
int mid = array.length/2;
if(array.length == 0) {return 0;}
if(array[0] == array[mid]) {return array[0];}
while(low<high){ //我算了一下,好像low=high的时候就是找到最小值的时候
if(array[0] < array[mid]) {
low = mid +1;
mid = low + (high - low) / 2;}
if(array[0] > array[mid]){
high = mid;
mid = low + (high - low) / 2; }
}
return array[low];
}
写的有点乱,这篇是5.19写的。被520日子打扰,真是的。
错了明早起来再改吧,今天先这样啦
以上是关于剑指offer的主要内容,如果未能解决你的问题,请参考以下文章
剑指 Offer(第 2 版)完整题解笔记 & C++代码实现(LeetCode版)
LeetCode(剑指 Offer)- 14- I. 剪绳子
LeetCode(剑指 Offer)- 14- I. 剪绳子
剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数