📜  从数组中查找缺失的元素

📅  最后修改于: 2021-10-27 16:59:36             🧑  作者: Mango

给定范围[1, N]中的整数列表,其中缺少一些元素。任务是找到缺失的元素。请注意,列表中可能存在重复项。
例子:

Input: arr[] = {1, 3, 3, 3, 5}
Output: 2 4

Input: arr[] = {1, 2, 3, 4, 4, 7, 7} 
Output: 5 6

方法:在给定的范围[1, N]中,每个索引都应该有一个元素对应。如果一个元素丢失,那么它的索引将永远不会被访问。

Traverse the array:
For each element:
    if array[element] > 0:
          Mark the element as visited
Again, traverse the array:
     if element isNot Visited:
           add it as missing element

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
// Function to find the missing elements
vector missing_elements(vector vec)
{
 
    // Vector to store the list
    // of missing elements
    vector mis;
 
    // For every given element
    for (int i = 0; i < vec.size(); i++) {
 
        // Find its index
        int temp = abs(vec[i]) - 1;
 
        // Update the element at the found index
        vec[temp] = vec[temp] > 0 ? -vec[temp] : vec[temp];
    }
    for (int i = 0; i < vec.size(); i++)
 
        // Current element was not present
        // in the original vector
        if (vec[i] > 0)
            mis.push_back(i + 1);
 
    return mis;
}
 
// Driver code
int main()
{
    vector vec = { 3, 3, 3, 5, 1 };
 
    // Vector to store the returned
    // list of missing elements
    vector miss_ele = missing_elements(vec);
 
    // Print the list of elements
    for (int i = 0; i < miss_ele.size(); i++)
        cout << miss_ele[i] << " ";
 
    return 0;
}


Java
// Java implementation of the above approach
import java.util.*;
 
class GFG
{
     
    // Function to find the missing elements
    static Vector missing_elements(Vector vec)
    {
     
        // Vector to store the list
        // of missing elements
        Vector mis = new Vector();
     
        // For every given element
        for (int i = 0; i < vec.size(); i++)
        {
     
            // Find its index
            int temp = Math.abs((int)vec.get(i)) - 1;
     
            // Update the element at the found index
            if ((int)vec.get(temp) > 0)
                vec.set(temp,-(int)vec.get(temp));
            else
                vec.set(temp,vec.get(temp));
        }
        for (int i = 0; i < vec.size(); i++)
        {
            // Current element was not present
            // in the original vector
            if ((int)vec.get(i) > 0)
                mis.add(i + 1);
        }
        return mis;
    }
     
    // Driver code
    public static void main(String args[])
    {
        Vector vec = new Vector();
        vec.add(3);
        vec.add(3);
        vec.add(3);
        vec.add(5);
        vec.add(1);
         
        // Vector to store the returned
        // list of missing elements
        Vector miss_ele = missing_elements(vec);
     
        // Print the list of elements
        for (int i = 0; i < miss_ele.size(); i++)
            System.out.print(miss_ele.get(i) + " ");
    }
}
 
// This code is contributed by AnkitRai01


Python3
# Python3 implementation of the approach
 
# Function to find the missing elements
def missing_elements(vec):
 
    # Vector to store the list
    # of missing elements
    mis = []
 
    # For every given element
    for i in range(len(vec)):
 
        # Find its index
        temp = abs(vec[i]) - 1
 
        # Update the element at the found index
        if vec[temp] > 0:
            vec[temp] = -vec[temp]
 
    for i in range(len(vec)):
 
        # Current element was not present
        # in the original vector
        if (vec[i] > 0):
            mis.append(i + 1)
 
    return mis
 
# Driver code
vec = [3, 3, 3, 5, 1]
 
# Vector to store the returned
# list of missing elements
miss_ele = missing_elements(vec)
 
# Print the list of elements
for i in range(len(miss_ele)):
    print(miss_ele[i], end = " ")
 
# This code is contributed by Mohit Kumar


C#
// C# implementation of the approach
using System;
using System.Collections.Generic;            
 
class GFG
{
     
    // Function to find the missing elements
    static List missing_elements(List vec)
    {
     
        // List to store the list
        // of missing elements
        List mis = new List();
     
        // For every given element
        for (int i = 0; i < vec.Count; i++)
        {
     
            // Find its index
            int temp = Math.Abs((int)vec[i]) - 1;
     
            // Update the element at the found index
            if ((int)vec[temp] > 0)
                vec[temp] = -(int)vec[temp];
            else
                vec[temp] = vec[temp];
        }
        for (int i = 0; i < vec.Count; i++)
        {
            // Current element was not present
            // in the original vector
            if ((int)vec[i] > 0)
                mis.Add(i + 1);
        }
        return mis;
    }
     
    // Driver code
    public static void Main(String []args)
    {
        List vec = new List();
        vec.Add(3);
        vec.Add(3);
        vec.Add(3);
        vec.Add(5);
        vec.Add(1);
         
        // List to store the returned
        // list of missing elements
        List miss_ele = missing_elements(vec);
     
        // Print the list of elements
        for (int i = 0; i < miss_ele.Count; i++)
            Console.Write(miss_ele[i] + " ");
    }
}
 
// This code is contributed by 29AjayKumar


Javascript


输出:
2 4

时间复杂度: O(N),其中 N 是向量vec长度。

辅助空间: O(N)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程