【牛客网刷题】(第四弹)多道中等难度题,早日拿offer,快来看看

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸
在这里插入图片描述


废话不多说,直接来做题!!

一、📖旋转数组的最小数字

newcoder旋转数组的最小数字

这道题利用二分法就oj,控制left 和right需要移动的条件
在这里插入图片描述

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        if(rotateArray.size()==0)
            return 0;
        int left=0,right=rotateArray.size()-1;
        while(left<right)
        {
            int mid=left+(right-left)/2;
            if(rotateArray[mid]<rotateArray[right])
            {
                right=mid;
            }
            else if(rotateArray[mid]>rotateArray[right])
            {                
                left=mid+1;
            }
            else
            {
                right--;    
            }
        }
        return rotateArray[left];
    }
};

二、📖最小的k个数(中等)值得一做

nowcoder最小的 k个数
要求空间复杂度O(N),时间复杂度O(NlogN)你会做吗,来看看这道题吧,我用的是堆排序+创建了一个临时数组,堆排序利用的是向下调整建堆,时间复杂度为O(N)
在这里插入图片描述

class Solution {
public:
    void AdjustDown(vector<int>& input,int parent)
    {
        int child=parent*2;
        while(child<=input.size()-1)
        {
            if(child+1<input.size()&&input[child]>input[child+1])
            {
                   child++;
            }
            if(input[child]<input[parent])
            {
                swap(input[child],input[parent]);
                parent=child;
                child=2*parent;
            }
            else
                break;
        }
    }
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> v;
        if(k==0)
            return v;
        for(int i=(input.size())/2;i>=0;i--)
        {
            AdjustDown(input,i);
        }
        for(int i=0;i<k;i++)
        {
            swap(input[0],input[input.size()-1]);
            v.push_back(input[input.size()-1]);
            input.pop_back();
            AdjustDown(input,0);
        }
        return v;
        
        
    }
};

三、📖二叉树的下一个结点(中等)

nowcoder二叉树的下一个结点

class Solution {
public:
    TreeLinkNode* GetNext(TreeLinkNode* p) {
        //中序遍历
        //右子树存在,找最左边的那个点
        if(p->right)
        {
            p=p->right;//先找出结点,然后一直找左
            while(p->left) p=p->left;
            return p;
        }
        //右子树不存在,
        while(p->next)
        {
            //p不是根结点
            if(p==p->next->left)
                return p->next;
            p=p->next;
        }
        
        return nullptr;
    }
};

四、📖矩阵中的路径(中等)

nowcoder矩阵中的路径
矩阵中的路径一直都是比较难的问题,这里用到了dfs

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix char字符型vector<vector<>> 
     * @param word string字符串 
     * @return bool布尔型
     */
    bool hasPath(vector<vector<char> >& matrix, string word) {
        // write code here
        if(matrix.size()==1&&matrix[0].size()==1)
            if(matrix[0][0]==word[0])
                return true;
            else
                return false;
        for(int i=0;i<matrix.size();i++)
        {
            for(int j=0;j<matrix[0].size();j++)
            {
                if(dfs(matrix,word,0,i,j))
                    return true;
            }
        }
        return false;
    }
    
    bool dfs(vector<vector<char>>&matrix,string word,int u,int x,int y)
    {
        
        int row=matrix.size();
        int col=matrix[0].size();
        if(word[u]=='\0')
            return true;
        int dx[4]={-1,0,1,0};
        int dy[4]={0,1,0,-1};
        for(int i=0;i<4;i++)
        {
            int a=x+dx[i],b=y+dy[i];
            if(a>=0&&a<row&&b>=0&&b<col&&matrix[a][b]==word[u])
            {
                char t =matrix[a][b];
                matrix[a][b]='*';
                if(dfs(matrix,word,u+1,a,b))
                    return true;
                matrix[a][b]=t;
            }
        }
        return false;
    }
};

五、📖牛客oj总结

牛客网是个很不错的刷题软件,也希望大家能天天在上面刷刷题,大厂offer指日可待啊兄弟们。刷起来。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪皮兄弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值