暑假算法7.21,Day20

这篇博客介绍了三个矩阵相关的算法问题:螺旋矩阵的遍历、矩阵置0以及在有序矩阵中找第K小的元素。作者分享了C++实现的代码,并提到在解决问题时的思考过程,强调了正确思路的重要性。此外,还提及了一个简单的数据处理问题,展示了如何通过排序快速判断一组数据是否符合条件。
摘要由CSDN通过智能技术生成
暑假算法7.21,Day20

矩阵

这几天有点浮躁,在准备科目二的考试,今天考完啦,也是顺利通过了。前面两天的题目刷的有点浮躁,会花时间重新补补。也再跟着b站里面的视频敲一个关于医疗方面的安卓app包括了前后台,如果后续完成了的话,也会分享出来

一起加油把!!

第一题

螺旋矩阵

这个题目写过,我也不知道为什么会再出一遍,可能重要吧,哈哈哈哈,代码里面有注释应该很容易看懂

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        int top = 0, bottom = m-1, left = 0, right = n-1;
        int cnt = m*n;
        vector<int> res;
        while(cnt>=1){
            //从左到右
            for(int j=left; j<=right && cnt>=1; j++, cnt--)
                res.push_back(matrix[top][j]);
            top++;
            //从上到下
            for(int i=top; i<=bottom && cnt>=1; i++, cnt--)
                res.push_back(matrix[i][right]);
            right--;
            //从右到左
            for(int j=right; j>=left && cnt>=1; j--, cnt--)
                res.push_back(matrix[bottom][j]);
            bottom--;
            //从下到上
            for(int i=bottom; i>=top && cnt>=1; i--, cnt--)
                res.push_back(matrix[i][left]);
            left++;
        }
        return res;
    }
};

请添加图片描述

第二题

矩阵置0

这个题目核心思想就是遍历搜索,首先要找到为0的数,然后把那一行和那一列都标记;最后再写一个循环去搜索判断就行

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        vector<int>a(matrix.size());//申请行空间
        vector<int>b(matrix[0].size());//申请列空间
        for(int i=0;i<matrix.size();i++){//遍历搜索矩阵
            for(int j=0;j<matrix[0].size();j++){
                if(matrix[i][j]==0){//标志
                    a[i]=true;
                    b[j]=true;
                }
            }
        }
        for(int i=0;i<matrix.size();i++){
            for(int j=0;j<matrix[0].size();j++){
                if(a[i]||b[j]){//最后进行对标记的判断
                    //被标记了,那么那一行和那一列的数都置0
                    matrix[i][j]=0;
                }
            }
        }
    }
};

请添加图片描述

第三题

有序矩阵第K小的元素

这个题目看一眼就知道怎么做的,首先把矩阵里面的数据放进一个线性容器里面去,然后排序,根据输入的k来获取第k小的数据即可。

class Solution {
public:
    int kthSmallest(vector<vector<int>>& matrix, int k) {
        vector<int>p;
        for(int i=0;i<matrix.size();i++){
            for(int j=0;j<matrix[0].size();j++){
                p.push_back(matrix[i][j]);//把矩阵数据一个接在一个后面放入vector容器里面
            }
        }
        sort(p.begin(),p.end());//对vector容器里面的数据进行排序
        return p[k-1];//返回需要查找的数据
    }
};

请添加图片描述

第四题

Ehab Fails to Be Thanos

题目大意:第一行输入一个n,接下来第二行输入2*n个数据,保证前面n个数的和与后面n个数的和不相等。

这个题简直就是一个傻瓜题。。一开始想着要把前面n个数和后面n个数的和都遍历一遍求出来然后再进行比较。代码敲到一半突然想到我是不是只需要把不符合条件的判断一遍就可以了呢,然后就开始想到只需要对数据进行排序不就可以了吗,如果不符合条件那么肯定所有的数据都是一样的啊。这样问题就解决了。

#include <bit/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[2*n+5];
    for(int i=0; i<2*n; i++)
    {
        cin>>a[i];
    }
    sort(a,a+2*n);
    if(a[0]!=a[2*n-1])
    {
        for(int i=0; i<2*n; i++)
        {
            if(i==2*n-1){
                cout<<a[i]<<endl;
            }else{
                cout<<a[i]<<" ";
            }

        }
    }
    else
    {
        cout<<"-1"<<endl;
    }
    return 0;
}

请添加图片描述

也许过程会骗人,但结果一定不会骗人!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值