seo于刷网站点击竞价排名是按照什么来计费的
前言
题目:406. 根据身高重建队列
参考题解:根据身高重建队列-代码随想录
提交代码
核心思路:先插入高个子。因为低个子的插入不影响高个子。
#include <vector>
#include <algorithm>
#include <iostream>using namespace std;class Solution {
public:struct cmp{bool operator() (const vector<int>& v1, const vector<int>& v2){if(v1[0] > v2[0])return true;else if(v1[0] == v2[0])return v1[1] < v2[1];elsereturn false;}};vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {// people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。// hi大者在前。hi相同,ki小者在前sort(people.begin(),people.end(),cmp());vector<vector<int>> result;for(vector<int> p : people){int count = 0;if(p[1] == count) // 未插入的身高最高的人,且他的前面没有身高大于等于他的人,插入在目前的最前方result.insert(result.begin(),p);else{for(int i=0; i<result.size(); i++){if(p[0] <= result[i][0])count++;if(count == p[1]){ // 前面有p[1]个身高大于等于自身身高,插入result.insert(result.begin()+i+1,p);break;}}}}return result;}
};int main(void){vector<vector<int>> peopele = {{7,0},{4,4},{7,1},{5,0},{6,1},{5,2}};Solution s;vector<vector<int>> result = s.reconstructQueue(peopele);for(auto v : result){cout<<"{"<<v[0]<<","<<v[1]<<"}";}
}
上面的代码可以简化。因为已经插入的所有人员,他们的身高都高于未插入的人员的身高。排序之后,未插入的人员的第二个元素,即为它们当前要插入的当前位置。
下面代码来自参考题解。
// 版本一
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;}
};
更换更好的数据结构来存储数据。
// 版本二
class Solution {
public:// 身高从大到小排(身高相同k小的站前面)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);list<vector<int>> que; // list底层是链表实现,插入效率比vector高的多for (int i = 0; i < people.size(); i++) {int position = people[i][1]; // 插入到下标为position的位置std::list<vector<int>>::iterator it = que.begin();while (position--) { // 寻找在插入位置it++;}que.insert(it, people[i]);}return vector<vector<int>>(que.begin(), que.end());}
};