剑指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——第二十九天(动态规划“困难”)

剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数

剑指 offer 刷题记录