[Serie de algoritmos (5)]: Colección

Tabla de contenido

1. Aplicación de algoritmos

349. Intersección de dos arreglos

217. Existen elementos duplicados

160. Lista enlazada de intersección

136. Números que solo aparecen una vez

1042. Plantación de flores no adyacentes


La tecnología de recopilación se utiliza principalmente para abordar el problema de la repetición de datos en la resolución de problemas . Echemos un vistazo al ejemplo del banco de preguntas de leetcode directamente para familiarizarnos con él. . .

1. Aplicación de algoritmos

349. Intersección de dos arreglos

  • Descripción del Título

Dadas dos matrices, escribe una función para calcular su intersección.

示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
  • Ideas para resolver problemas

Utilizar directamente la estructura de la colección

  • Implementación de código C ++
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
    set<int> set1(nums1.begin(),nums1.end());
    set<int> set2(nums2.begin(),nums2.end());
 
    vector<int> res;
 
    for(auto i=set1.begin();i!=set1.end();++i){
        if(set2.find(*i)!=set2.end()){
            res.push_back(*i);
        }
    }
 
    return res;
}

217. Existen elementos duplicados

  • Descripción del Título

Dada una matriz de enteros, determine si hay elementos duplicados.

Si algún valor aparece al menos dos veces en la matriz, la función devuelve verdadero. Si cada elemento de la matriz es diferente, se devuelve falso.

示例 1:
输入: [1,2,3,1]
输出: true

示例 2:
输入: [1,2,3,4]
输出: false
  • Ideas para resolver problemas

A través del método de recolección

  • Implementación de código C ++
 bool containsDuplicate(vector<int>& nums) {
	 map<int, int> dict;
	 for (int i = 0;i < nums.size();i++) {
		 if (dict.find(nums[i]) != dict.end()) {
			 return true;
		 }
		 else {
			 dict.insert(pair<int, int>(nums[i], 1));
		 }
	 }

	 return false;
 }

160. Lista enlazada de intersección

  • Descripción del Título

Escribe un programa para encontrar el nodo inicial donde se cruzan dos listas unidas.

Como las siguientes dos listas enlazadas :

La intersección comienza en el nodo c1.

Ejemplo 1:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 
[4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 
个节点。
  • Ideas para resolver problemas

A través del método de recolección

  • Implementación de código C ++
 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
	 set<ListNode *> hash;
	 ListNode *tmp = headA;
	 while (tmp != NULL) {
		 hash.insert(tmp);
		 tmp = tmp->next;
	 }

	 tmp = headB;
	 while (tmp != NULL) {
		 if (hash.find(tmp) != hash.end()) {
			 return tmp;
		 }
		 tmp = tmp->next;
	 }

	 return NULL;
 }

136. Números que solo aparecen una vez

  • Descripción del Título

Dada una matriz de números enteros no vacíos , excepto por un elemento que aparece solo una vez, todos los demás elementos aparecen dos veces. Encuentra el elemento que aparece solo una vez.

示例 1:
输入: [2,2,1]
输出: 1

示例 2:
输入: [4,1,2,1,2]
输出: 4
  • Ideas para resolver problemas

A través del método de recolección

  • Implementación de código C ++
int singleNumber(vector<int>& nums) {
	 set<int> sets;
	 for (int i = 0;i < nums.size();++i) {
		 if (sets.find(nums[i]) != sets.end()) {
			 sets.erase(nums[i]);
			 continue;
		 }
		 else {
			 sets.insert(nums[i]);
		 }
	 }

	 return *sets.begin();
 }

1042. Plantación de flores no adyacentes

  • Descripción del Título

Hay N jardines, marcados de 1 a N. En cada jardín, planea plantar uno de los cuatro tipos de flores.

caminos [i] = [x, y] describe el camino de dos vías desde el jardín x al jardín y.

Además, ningún jardín tiene más de 3 caminos para entrar o salir.

Debe elegir un tipo de flor para cada jardín, de modo que los tipos de flores en dos jardines conectados por un camino sean diferentes entre sí.

Devuelve las soluciones seleccionadas como una matriz como respuesta, donde la respuesta [i] es el tipo de flor plantada en el jardín (i + 1). Los tipos de flores están representados por 1, 2, 3 y 4. Asegúrese de que haya una respuesta.

示例 1:
输入:N = 3, paths = [[1,2],[2,3],[3,1]]
输出:[1,2,3]

示例 2:
输入:N = 4, paths = [[1,2],[3,4]]
输出:[1,2,1,2]

示例 3:
输入:N = 4, paths = [[1,2],[2,3],[3,4],[4,1],[1,3],[2,4]]
输出:[1,2,3,4]
  • Ideas para resolver problemas

Utilice dictionary + set para construir una lista de adyacencia de gráficos.

  • Implementación de código C ++
bool judge(int j, vector<int>& res, vector<int>& vec)
    {
        for(int k=0;k<vec.size();k++)
        {
            if(res[vec[k]]==j)
            {
                return false;
            }
        }
        return true;
    }
 
    vector<int> gardenNoAdj(int N, vector<vector<int>>& paths) 
    {
        vector<int> res(N,0);
        int m=paths.size();
        vector<vector<int>> tmp(N);
        for(int i=0;i<m;i++)
        {
            tmp[paths[i][0]-1].push_back(paths[i][1]-1);
            tmp[paths[i][1]-1].push_back(paths[i][0]-1);
        }
        for(int i=0;i<N;i++)
        {
            for(int j=1;j<=4;j++)
            {
                if(judge(j,res,tmp[i]))
                {
                    res[i]=j;
                    break;
                }
            }
        }
        return res;
    }

Link de referencia:

Aplicación de la tecnología de conjuntos en la resolución de problemas algorítmicos

Supongo que te gusta

Origin blog.csdn.net/wxplol/article/details/108461039
Recomendado
Clasificación