23.1.11力扣刷题

不知道刷什么好欸,剑指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. 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

捂脸,完了忘了直接看题解然后写一下吧
明天再写吧
效率好低

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值