leetcode 1030
学习c++ sort的基本用法之后,这道题还是比较easy.
Beginners guide to the std::sort() function

解法一:

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;
    }
};