学习c++ sort的基本用法之后,这道题还是比较easy.
解法一:
class Solution {
public:
vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) {
vector<vector<int>> res(R*C,vector<int>(3));
int num=0;
for(int i=0;i<C;i++)
{
for(int j=0;j<R;j++)
{
res[num][0]=j;
res[num][1]=i;
res[num][2]=abs(r0-j)+abs(c0-i);
num++;
}
}
sort(res.begin(),res.end(),ismax);
for(int i=0;i<num;i++)
{
res[i].pop_back();
}
return res;
}
static bool ismax(vector<int> &a,vector<int> &b)
{
return a[2]<b[2];
}
};
解法二:
使用lambda表达式,减少了计算曼哈顿距离,保存和删除曼哈顿距离的步骤,最后调用sort排序使用lambda表达式,传递局部变量r0和c0到sort函数中。
class Solution {
public:
vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) {
vector<vector<int>> res;
for(int i=0;i<R;i++)
{
for(int j=0;j<C;j++)
{
vector<int> inner_ivec;
inner_ivec.push_back(i);
inner_ivec.push_back(j);
res.push_back(inner_ivec);
}
}
sort(res.begin(),res.end(),[r0,c0](vector<int>& A, vector<int>& B){return(abs(A[0]-r0) + abs(A[1]-c0) < abs(B[0]-r0) + abs(B[1]-c0));});
return res;
}
};
解法三:
使用multimap,正常的map的话key value一一对应,由于存在相同曼哈顿距离,所以使用multimap.同一个key可以对应不同的value.
验证程序:
#include <iostream>
#include <map>
int main ()
{
std::multimap<char,int> mymm;
mymm.insert (std::make_pair('x',10));
mymm.insert (std::make_pair('y',20));
mymm.insert (std::make_pair('z',30));
mymm.insert (std::make_pair('z',40));
std::multimap<char,int>::iterator it;
for(it = mymm.begin();it != mymm.end();it++)
{
std::cout <<it->first << " : "<< it->second<<std::endl;
}
return 0;
}
输出:
x : 10
y : 20
z : 30
z : 40
#include <iostream>
#include <map>
int main ()
{
std::map<char,int> mymm;
mymm.insert (std::make_pair('x',10));
mymm.insert (std::make_pair('y',20));
mymm.insert (std::make_pair('z',30));
mymm.insert (std::make_pair('z',40));
std::multimap<char,int>::iterator it;
for(it = mymm.begin();it != mymm.end();it++)
{
std::cout <<it->first << " : "<< it->second<<std::endl;
}
return 0;
}
程序输出
x : 10
y : 20
z : 30
class Solution {
public:
vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) {
int distance = 0;
//因为存在距离相同的情况,所以用multimap
multimap<int, vector<int>> map;
vector<vector<int>> res;
for(int i=0; i<R; i++){
for(int j=0; j<C; j++){
distance = abs(i-r0) + abs(j-c0);
vector<int> inner_ivec;
inner_ivec.push_back(i);
inner_ivec.push_back(j);
map.emplace(distance,inner_ivec);
}
}
multimap<int, vector<int>>::iterator i;
for(i=map.begin();i!=map.end();i++){
res.push_back((*i).second);
}
return res;
}
};