1 algoritmo codicioso bidimensional (versión de lista vinculada)
[Codicia]: ordena la altura de las dos dimensiones (la primera dimensión) en orden descendente, entre las cuales la altura de la misma altura, (la segunda dimensión) el número k delante de ella ocupa el primer lugar
局部最优
: Primero inserte personas altas de acuerdo con el número k frente a ellas, de modo que cuando las inferiores se inserten hacia adelante, los atributos de las altas no se destruyan
全局最优
: Finalmente, se realiza la operación de inserción y toda la cola satisface el atributo de la cola de preguntas
Personas clasificadas:
[[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]
Proceso de inserción:
Insertar [7, 0]: [[7,0]]
insertar [7,1]: [[7,0], [7,1]]
insertar [6,1]: [[7,0], [6,1], [7, 1]]
Inserte [5,0]: [[5,0], [7,0], [6,1], [7,1]]
Inserte [5,2]: [[5,0], [ 7,0], [5,2], [6,1], [7,1]]
insertar [4,4]: [[5,0], [7,0], [5,2], [ 6,1], [4,4], [7,1]]
Estrategia para esta pregunta:
- La h más alta tiene la prioridad más alta, y el mismo tamaño tiene la k más baja primero.
- El inferior se inserta en la posición de k_i antes de la lista enlazada (no destruye los atributos del más alto delante del inferior)
class Solution {
private:
static bool cmp(vector<int>& a, vector<int>& b) {
if (a[0] == b[0]) return a[1] < b[1];
return a[0] > b[0];
}
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
// 1.高个子h大的优先,同等个子k小的优先
sort(people.begin(), people.end(), cmp);
list<vector<int>> lst; // 链表提高插入效率
lst.emplace_back(people[0]);
for (int i = 1; i < people.size(); i++) {
auto it = lst.begin();
advance(it, people[i][1]); // 将链表起始迭代器向后推进k_i个
// 2.后面低个子插入到链表前k_i的位置(不破坏低个子前面高个子的属性)
lst.insert(it, people[i]);
}
// 3.list转vector
return vector<vector<int>> (lst.begin(), lst.end());
}
};
Gracias
La imagen proviene de la cuenta oficial de "Code Random Record", bienvenidos a todos a que presten atención a la cuenta oficial de este grandullón.