题干:
代码:
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b){
if(a[0] == b[0]) return a[1] < b[1];
return a[0] > b[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), cmp);
vector<vector<int>> que;
for(int i = 0; i < people.size(); i++){
int position = people[i][1];
que.insert(que.begin() + position, people[i]);
}
return que;
}
};
贪心思路:由k可知h需从大到小排序,让h大的排前面。如果h相同让k小的排前面。
疑惑点:cmp算法的书写:
sort函数中的比较函数cmp(),即void sort( iterator start, iterator end, StrictWeakOrdering cmp );
sort函数头文件为:#include <algorithm>
其中,cmp函数可以自己编写,自己决定逻辑,包括cmp的命名也是自己决定的。
示例如下:
bool cmp(int a ,int b)
{
return a < b ; 从小到大排序,把 < 换成 > 就是从大到小
}
sort(p.begin(), p.end(), cmp);
其中的比较逻辑可以任意定义,也可以传入数组或对象,依据多重数据来嵌套排序(例如,球队按积分从高到低排序,积分相同的按净胜球排序,净胜球相同的按进球排序,进球相同的按球队名字典序排序——某厂笔试题)。
例如:传入两个数组(只有0、1元素),按[0]从大到小排序,如果[0]相同,按[1]从小到大排序。
static bool cmp(const vector<int>& a, const vector<int>& b) {
if (a[0] == b[0]) return a[1] < b[1]; [0]相同则比较[1]
return a[0] > b[0]; 比较[0]
}
注意到,其中和cmp函数的示例有以下不同:
1. 形参写成了const引用的形式
2. 函数更改为静态函数static
关于1:当引用作为形参,函数调用时也可以看成将传递的实参绑定给它,这样我们在函数体内对这个引用做的一切操作都有可能影响到函数传递的实参。如果我们希望参数在函数体内是只读的,所以当我们加了引用有希望参数是只读的就必须加 const。
为什么不直接值传递呢? 确实,但是当参数是类对象时值传递就有了一个问题,那就是性能可能会大受影响。我们知道值传递实际就是向函数拷贝一份副本来使用,那么对于一些复杂的类,尤其是 string 这样每一次拷贝可能消耗很多的时间,那么通过引用传参就很有必要了。
总的来说因为我想提高类对象传参时的性能,所以要用引用,因为用了引用我又希望它只读所以我用了const。
关于2:在(非静态成员)函数的返回类型前加上关键字static,函数就被定义成为静态函数。普通 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。因此定义静态函数有以下好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突。
<2> 静态函数不能被其他文件所用。