1326. 边界排序

边界排序题目

给定一个n * n 的矩阵,按照矩阵的层次顺时针排序,返回按层排好序的矩阵

样例

在这里插入图片描述

示例

输入:
grids = [[9, 9, 8, 8], [4, 3, 3, 7], [4, 2, 2, 7], [5, 5, 6, 6]]
输出: [[4, 4, 5, 5], [9, 2, 2, 6], [9, 3, 3, 6], [8, 8, 7, 7]]
解释: 矩阵第一层边界的元素是 [9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4], 经过排序变成了[4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9], 第二层边界元素是 [3, 3, 2, 2], 经过排序之后是 [2, 2, 3, 3]

注意事项

1 <= grids.size() <= 500

思考

对这道题目,本人没想到比较好的解决方案,只是中规中矩的按照要求,先判断总共由多少层,再取出第一层的所有数据,然后对该层数据进行排序,最后写入数组中,然后再进行下一层的操作。

参考代码C++

class Solution {
public:
    /**
     * @param grids: a matrix of integer
     * @return: return a boarder sort matrix
     */
    vector<vector<int>> BoarderSort(vector<vector<int>> &grids) {
        // write your code here
        int size = grids.size();
        if(size == 1){
            return grids;
        }
        int floors =0;
        if(size%2 == 1){
            floors = size/2 +1;
        }else{
            floors = size/2;
        }
        for(int i =0;i<floors;i++){
            //取出每一层的所有元素
            vector<int> temp;
            for(int j=0;j<size -2*i;j++){
                temp.push_back(grids[i][i+j]);
            }
            for(int j=1;j<size -2*i;j++){
                temp.push_back(grids[i+j][size-i-1]);
            }
            //size -i-1-1 减去两个一的原因是,第一个1是因为从0开始,第二个1是因为每层的角上的点已经记录的,不能重复记录
            for(int j =size -i-1-1;j>i;j--){
                temp.push_back(grids[size -i-1][j]);
            }
            for(int j =size -i-1;j>i;j--){
                temp.push_back(grids[j][i]);
            }
            //对数据进行排序,本次使用冒泡排序
            int  tempsize = temp.size();
            for(int j=0;j<tempsize;j++){
                for(int k =j+1;k<tempsize;k++){
                    if(temp[j]>temp[k]){
                        int xx = temp[j];
                        temp[j] = temp[k];
                        temp[k] = xx;
                    }
                }
            }
            //重新赋值到数组上;
            int point =0;
             for(int j=0;j<size -2*i;j++){
                grids[i][i+j] = temp[point];
                point++;
            }
            for(int j=1;j<size -2*i;j++){
                grids[i+j][size-i-1]= temp[point];
                point++;
            }
            //size -i-1-1 减去两个一的原因是,第一个1是因为从0开始,第二个1是因为每层的角上的点已经记录的,不能重复记录
            for(int j =size -i-1-1;j>i;j--){
                grids[size -i-1][j] = temp[point];
                point++;
            }
            for(int j =size -i-1;j>i;j--){
                grids[j][i] = temp[point];
                point++;
            }
            
        }
        return grids;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值