1.用两个栈实现队列
思路:利用两个栈,一个栈用来进数据,当出数据时,看另一个栈是否为空,如果为空,就压入栈1的所有元素,然后出栈顶,不为空直接出栈顶。

class CQueue {
public:
    stack<int> s1,s2;
public:
    CQueue() {
        while (!s1.empty()) {
            s1.pop();
        }
        while (!s2.empty()) {
            s2.pop();
        }
    }//清空里面的元素

    void appendTail(int value) {
        s1.push(value);
    }

    int deleteHead() {
        if(s2.empty())
        {
            while(!s1.empty())
            {
                s2.push(s1.top());
                s1.pop();
            }
        }//如果s2是空的,就压入s1的元素
        if(s2.empty())
        {
            return -1;
        }
        //否则,正常pop()栈顶即可
        int a=s2.top();
        s2.pop();
        return a;
    }
};

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */

2.旋转数组的最小数字
思路:注意不会溢出的二分写法,和右比,返回左。

class Solution {
public:
    int minArray(vector<int>& numbers) {
        int low = 0;
        int high = numbers.size() - 1;
        while (low < high) {
            int pivot = low + (high - low) / 2;//这种不会溢出
            if (numbers[pivot] < numbers[high]) {
                high = pivot;
            }//45123
            else if (numbers[pivot] > numbers[high]) {
                low = pivot + 1;
            }//23451
            else {
                high -= 1;
            }
        }
        return numbers[low];
    }
};

3.矩阵中的路径

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        if(board.size()==0||board[0].size()==0||word.length()==0) return false;
        int rows=board.size(),cols=board[0].size();
        for(int i=0;i<rows;i++)
        {
            for(int j=0;j<cols;j++)
            {
                if(judge(i,j,rows,cols,board,word,0))
                {
                    return true;
                }
            }
        }
        return false;
    }
    bool judge(int row,int col,int rows,int cols,vector<vector<char>>& board, string word,int k)
    {
        if (row >= rows || row < 0 || col >= cols || col < 0 || board[row][col] != word[k]) 
            return false;//非法直接返回false
        if (k == word.length() - 1)
            return true;//遍历到字符串末尾返回true
        char temp = board[row][col];
        board[row][col] = '/';//用一个不可能存在的字符来代替visited数组
        int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
        for (int q = 0; q < 4; q ++ ) {
            int m = row + dx[q], n = col + dy[q];
            if (judge(m,n,rows,cols,board,word,k+1)) return true;
        }
        board[row][col] = temp;//如果没有出现true,就返回原值
        return false;
    }
};