不知道刷什么好欸,剑指offer开始随便刷刷吧
剑指 Offer 09. 用两个栈实现队列
简单
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
class CQueue {
public:
stack<int> s1,s2,t;
CQueue() {
}
void appendTail(int value) {
s1.push(value);
}
int deleteHead() {
if(s1.empty())
return -1;
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
int value=s2.top();
s2.pop();
while(!s2.empty())
{
s1.push(s2.top());
s2.pop();
}
return value;
}
};
写复杂了其实,每次只需要倒一次就可以
我倒了两次QAQ
剑指 Offer 30. 包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
class MinStack {
public:
/** initialize your data structure here. */
stack<int>s,t;
int mn;//最小值
MinStack() {
}
void push(int x) {
if(s.empty())
mn=x;
else
mn=::min(x,mn);
s.push(x);
t.push(mn);
}
void pop() {
t.pop();
s.pop();
if(!t.empty())
mn=t.top();
}
int top() {
return s.top();
}
int min() {
return t.top();
}
};
辅助栈,学习到了
每次维护最小值
剑指 Offer 03. 数组中重复的数字
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
class Solution {
public:
map<int,int>mp;
int findRepeatNumber(vector<int>& nums) {
for(int i:nums)
{
if(mp[i])
return i;
mp[i]++;
}
return -1;
}
};
标记
找到的话就直接返回就ok
看了题解
原地交换法或许稍稍省了空间
剑指 Offer 04. 二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
这题真是个好题
下面是错误的代码。。。第一次思路错了,
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
int n=matrix.size();
if(n==0)
return 0;
int i=0,j=0,m=matrix[0].size();
if(m==0)
return 0;
while(i+1<m&&matrix[0][i+1]<=target)
i++;
while(j+1<n&&matrix[j+1][i]<=target)
j++;
return matrix[j][i]==target;
}
};
又换了一个思路TAT还是错了欸
感觉是二分差不多的感觉
但是忘了在思考一下
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
int n=matrix.size();
if(n==0)
return 0;
int m=matrix[0].size();
int i=n-1,j=m-1;
if(m==0)
return 0;
while(i>0&&matrix[i][0]>target)
i--;
while(j>0&&matrix[0][j]>target)
j--;
for(int t=0;t<m;t++)
if(matrix[i][t]==target)
return 1;
for(int t=0;t<n;t++)
if(matrix[t][j]==target)
return 1;
return 0;
}
};
重新思考一下
我们可以想象是一个框框
然后左上角是最小值
右下角是最大值
我们可以不断更新最小最大值
确定范围区域缩小范围
不行不行因为不是连续变化的TAT
好像差不多?所以我们最终只能搜索一个大致的缩小的框框?
继续第二次写的
第一次过了TAT真不容易
击败百分之76的时间还可以吧,不知道官方怎么写的应该比我简单很多
有个地方可以优化就是找的过程可以用二分来找
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
int n=matrix.size();
if(n==0)
return 0;
int m=matrix[0].size();
int i=n-1,j=m-1;
if(m==0)
return 0;
while(i>0&&matrix[i][0]>target)
i--;
while(j>0&&matrix[0][j]>target)
j--;
int a=i,b=j;
i=j=0;
while(i<a&&matrix[i][b]<target)
i++;
while(j<b&&matrix[a][j]<target)
j++;
int c=i,d=j;
for(int i=c;i<=a;i++)
for(int j=d;j<=b;j++)
if(matrix[i][j]==target)
return 1;
return 0;
}
};
T~T果然写复杂了
看了题解的思路真的绝
重新写了下
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
int n=matrix.size();
if(n==0)
return 0;
int m=matrix[0].size();
if(m==0)
return 0;
int i=n-1,j=0;
while(i>=0&&j<m)
{
if(matrix[i][j]==target)
return 1;
else if(matrix[i][j]>target)
i--;
else
j++;
}
return 0;
}
};
QAQ时间复杂度居然没有提高。。。。
剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
直接遍历换就好
class Solution {
public:
string replaceSpace(string s) {
string ans;
for(char i :s)
{
if(i==' ')
ans+="%20";
else
ans+=i;
}
return ans;
}
};
或者是我记的string有个replace函数
T_T发现c++的replace没有替换特定字符串的功能
python有
class Solution(object):
def replaceSpace(self, s):
return s.replace(" ","%20")
剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
其实不是很想写水题
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
vector<int>ans;
ListNode* p=head;
while(p!=NULL)
{
ans.push_back(p->val);
p=p->next;
}
reverse(ans.begin(),ans.end());
return ans;
}
};
反转一下就欧克
对哦可以递归,有道理
剑指 Offer 07. 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
捂脸,完了忘了直接看题解然后写一下吧
明天再写吧
效率好低