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;
}
};
京公网安备 11010502036488号