《剑指offer》刷题打卡第3天

面试题5:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

基础知识储备:
操作系统会给每个线程创建一个栈用来存储函数调用时各个函数的参数、返回地址及临时变量等。

栈:
栈的特点是后进先出,即最后被压入(push)栈的元素会被第一个弹出(pop)。
在这里插入图片描述

队列:
队列是另外一种很重要的数据结构。和栈不同的是,队列的特点是先进先出,即第一个进入队列的元素将会第一个出来。
在这里插入图片描述
算法思路:
一个队列包含了两个栈stack1和stack2,本题意在于操作这两个“先进后出”的栈实现一个“先进先出”的队列CQueue。
通过一个具体的例子来分析往该队列插入和删除元素的过程。
1、 首先,往stack1中依次插入三个元素{a,b,c},按照栈的先进后出的原则,元素C位于栈顶。此时,stack2为空。
在这里插入图片描述
2、 然后,根据队列的先进先出的原则,元素a最先进,那么该元素也是最先出去的一个,但该元素位于stack1的底部,故此时需要借用第二个空栈stack2来实现。操作方法是将stack1中的元素依次弹出,压入stack2中。此时元素在stack2中的排列顺序是{c,b,a},其中a位于栈顶,此时,便可将其按照队列先进先出的顺序依次弹出。
在这里插入图片描述
示意图:
在这里插入图片描述
代码实现:

class Solution
{
public:
    void push(int node) {
        stack1.push(node);
    }

    int pop() {
     int a;
     if(stack2.empty()) 
     {
         while(!stack1.empty())
         {
             a=stack1.top();
             stack2.push(a);
             stack1.pop();
         } 
     }
       a=stack2.top();
        stack2.pop();
       return a;
    }
private:
    stack<int> stack1;
    stack<int> stack2;
};

面试题6:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

算法思路:
旋转之后的数组可以划分为两个排序的子数组,特点:1、前面子数组的元素都大于或者等于后面子数组的元素;2、最小的元素刚好是这两个子数组的分界线。在排序的数组中可以采用二分法实现时间复杂度为o(logn)的查找。
步骤:
1、首先,用两个指针分别指向数组的第一个元素和最后一个元素;
2、其次,找到数组中间元素,
如果该元素大于或者等于第一个指针指向的元素,此时数组中最小的元素应该位于该中间元素的后面,故将第一个指针指向该中间元素;
如果第二个指针指向的元素大于等于中间元素,则令第二个指针指向中间元素位置;
3、循环结束的条件:循环到最后,第一个指针将指向前面子数组的最后一个元素,而第二个指针指向后面子数组的第一个元素。即两个指针会指向相邻的两个元素,而第二个指针指向的是最小的元素。

举例说明:
在这里插入图片描述
代码实现:

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        
        int index1=0;
		int index2=rotateArray.size()-1;
		int indexMid=index1;
		
		while(rotateArray[index1]>=rotateArray[index2])
        {
		  if(index2-index1 == 1)
		  {
		    indexMid=index2;
			break;
		  }
		  
		  indexMid=(index1+index2)/2;
        
        //注释部分:
		 /* if(rotateArray[index1]==rotateArray[index2]
		  &&rotateArray[indxMid]==rotateArray[index1]
		  )
		  return MinInOrder(rotateArray,index1,index2);*/


        if(rotateArray[indexMid]>=rotateArray[index1])
		  index1=indexMid;
		  
		  if(rotateArray[indexMid]<=rotateArray[index2])
		  index2=indexMid;
		}
		return rotateArray[indexMid];
	}
	
	//注释部分:
	/*int MinInOrder(rotateArray,index1,index2)
	{
	  int result=rotateArray[index1];
	  for(int i=index1+1;i<=index2;++i)
	  {
	   if(result>rotateArray[i])
	   result=rotateArray[i];
	  
	  }
	  return result;
}*/

};

猜你喜欢

转载自blog.csdn.net/tpf930726/article/details/88896204