链接:https://leetcode.com/problems/matrix-cells-in-distance-order/
思路
approach 1
距离dist最大为R+C,迭代dist,迭代距离为dist的所有点,看点是否在矩阵内,如果dist对应的所有点都不在,那dist不能再加。
approach 2
点共有R*C个,按照点的距离升序排序,由于RC不大,使用计数排序。先迭代所有点,算出dist_cnt,dist_cnt[i]表示距离为i的点有多少个,有了这一信息,就可以知道距离为i的点最终会处于哪一区间。再迭代所有点,根据其距离放到对应区间。
代码
approach 1
class Solution {
private:
vector<vector<int>> res;
// 如果能有一个点在矩阵内,返回true,说明dist还可能更大
bool is_valid(int R, int C, int r, int c, int r_dist, int c_dist) {
if(r_dist == 0) {
bool b1 = is_in(R, C, r, c + c_dist),
b2 = is_in(R, C, r, c - c_dist);
return b1 || b2;
}
if(c_dist == 0) {
bool b1 = is_in(R, C, r + r_dist, c),
b2 = is_in(R, C, r - r_dist, c);
return b1 || b2;
}
bool b1 = is_in(R, C, r + r_dist, c + c_dist),
b2 = is_in(R, C, r + r_dist, c - c_dist),
b3 = is_in(R, C, r - r_dist, c + c_dist),
b4 = is_in(R, C, r - r_dist, c - c_dist);
return b1 || b2 || b3 || b4;
}
bool is_in(int R, int C, int r, int c) {
if(r >= 0 && r < R && c >= 0 && c < C) {
res.push_back(vector<int>{r, c});
return true;
}
return false;
}
public:
vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) {
if(!is_in(R, C, r0, c0)) return res; // dist 0
for(int dist = 1; true; dist++) {
bool flag = false; // find one
for(int r_dist = 0; r_dist <= dist; r_dist++) {
if(is_valid(R, C, r0, c0, r_dist, dist - r_dist)) flag = true;
}
if(!flag) return res;
}
return res;
}
};
approach 2
class Solution {
public:
vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) {
vector<vector<int>> res(R*C);
vector<int> dist_cnt(R+C+1); // dist_cnt[i]表示距离为i的点个数
for(int i = 0; i < R; i++) {
for(int j = 0; j < C; j++) {
int dist = abs(i - r0) + abs(j - c0);
dist_cnt[dist]++;
}
}
vector<int> dist_start(R+C+1); // dist_start[i]表示距离为i的点该放到哪
dist_start[0] = 0;
for(int i = 1; dist_cnt[i] > 0; i++) {
dist_start[i] = dist_start[i-1] + dist_cnt[i-1];
}
for(int i = 0; i < R; i++) {
for(int j = 0; j < C; j++) {
int dist = abs(i - r0) + abs(j - c0);
res[dist_start[dist]] = {i, j};
dist_start[dist]++;
}
}
return res;
}
};