边界排序题目
给定一个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;
}
};