给定一个整数数组,找到其中的第一个重复元素。我们需要找到出现多次且第一次出现的索引最小的元素。
例子:
Input: arr[] = {10, 5, 3, 4, 3, 5, 6}
Output: 5 [5 is the first element that repeats]
Input: arr[] = {6, 10, 5, 4, 9, 120, 4, 6, 10}
Output: 6 [6 is the first element that repeats]
一个简单的解决方案是使用两个嵌套循环。外循环逐个选取一个元素,内循环检查该元素是否重复。一旦我们找到一个重复的元素,我们就打破循环并打印该元素。此解决方案的时间复杂度为 O(n 2 )
我们可以使用排序在 O(nLogn) 时间内解决问题。以下是详细步骤。
1) 将给定数组复制到辅助数组 temp[]。
2) 使用 O(nLogn) 时间排序算法对临时数组进行排序。
3)从左到右扫描输入数组。对于每个元素,使用二进制搜索计算它在 temp[] 中的出现次数。一旦我们找到一个多次出现的元素,我们就返回该元素。这一步可以在 O(nLogn) 时间内完成。
我们可以使用哈希在平均 O(n) 时间内解决这个问题。这个想法是从右到左遍历给定的数组,并在我们找到右侧已经访问过的元素时更新最小索引。感谢 Mohammad Shahid 提出这个解决方案。
下面是这个想法的实现。
C++
/* C++ program to find first repeating element in arr[] */
#include
using namespace std;
// This function prints the first repeating element in arr[]
void printFirstRepeating(int arr[], int n)
{
// Initialize index of first repeating element
int min = -1;
// Creates an empty hashset
set myset;
// Traverse the input array from right to left
for (int i = n - 1; i >= 0; i--)
{
// If element is already in hash set, update min
if (myset.find(arr[i]) != myset.end())
min = i;
else // Else add element to hash set
myset.insert(arr[i]);
}
// Print the result
if (min != -1)
cout << "The first repeating element is " << arr[min];
else
cout << "There are no repeating elements";
}
// Driver method to test above method
int main()
{
int arr[] = {10, 5, 3, 4, 3, 5, 6};
int n = sizeof(arr) / sizeof(arr[0]);
printFirstRepeating(arr, n);
}
//This article is contributed by Chhavi
Java
/* Java program to find first repeating element in arr[] */
import java.util.*;
class Main
{
// This function prints the first repeating element in arr[]
static void printFirstRepeating(int arr[])
{
// Initialize index of first repeating element
int min = -1;
// Creates an empty hashset
HashSet set = new HashSet<>();
// Traverse the input array from right to left
for (int i=arr.length-1; i>=0; i--)
{
// If element is already in hash set, update min
if (set.contains(arr[i]))
min = i;
else // Else add element to hash set
set.add(arr[i]);
}
// Print the result
if (min != -1)
System.out.println("The first repeating element is " + arr[min]);
else
System.out.println("There are no repeating elements");
}
// Driver method to test above method
public static void main (String[] args) throws java.lang.Exception
{
int arr[] = {10, 5, 3, 4, 3, 5, 6};
printFirstRepeating(arr);
}
}
Python3
# Python3 program to find first repeating
# element in arr[]
# This function prints the first repeating
# element in arr[]
def printFirstRepeating(arr, n):
# Initialize index of first repeating element
Min = -1
# Creates an empty hashset
myset = dict()
# Traverse the input array from right to left
for i in range(n - 1, -1, -1):
# If element is already in hash set,
# update Min
if arr[i] in myset.keys():
Min = i
else: # Else add element to hash set
myset[arr[i]] = 1
# Print the result
if (Min != -1):
print("The first repeating element is",
arr[Min])
else:
print("There are no repeating elements")
# Driver Code
arr = [10, 5, 3, 4, 3, 5, 6]
n = len(arr)
printFirstRepeating(arr, n)
# This code is contributed by Mohit kumar 29
C#
using System;
using System.Collections.Generic;
/* C# program to find first repeating element in arr[] */
public class GFG
{
// This function prints the first repeating element in arr[]
public static void printFirstRepeating(int[] arr)
{
// Initialize index of first repeating element
int min = -1;
// Creates an empty hashset
HashSet set = new HashSet();
// Traverse the input array from right to left
for (int i = arr.Length - 1; i >= 0; i--)
{
// If element is already in hash set, update min
if (set.Contains(arr[i]))
{
min = i;
}
else // Else add element to hash set
{
set.Add(arr[i]);
}
}
// Print the result
if (min != -1)
{
Console.WriteLine("The first repeating element is " + arr[min]);
}
else
{
Console.WriteLine("There are no repeating elements");
}
}
// Driver method to test above method
public static void Main(string[] args)
{
int[] arr = new int[] {10, 5, 3, 4, 3, 5, 6};
printFirstRepeating(arr);
}
}
// This code is contributed by Shrikant13
Javascript
C++
/* C++ program to find first
repeating element in arr[] */
#include
using namespace std;
// This function prints the
// first repeating element in arr[]
void printFirstRepeating(int arr[], int n)
{
// This will set k=1, if any
// repeating element found
int k = 0;
// max = maximum from (all elements & n)
int max = n;
for (int i = 0; i < n; i++)
if (max < arr[i])
max = arr[i];
// Array a is for storing
// 1st time occurence of element
// initialized by 0
int a[max + 1] = {};
// Store 1 in array b
// if element is duplicate
// initialized by 0
int b[max + 1] = {};
for (int i = 0; i < n; i++)
{
// Duplicate element found
if (a[arr[i]])
{
b[arr[i]] = 1;
k = 1;
continue;
}
else
// storing 1st occurence of arr[i]
a[arr[i]] = i;
}
if (k == 0)
cout << "No repeating element found" << endl;
else
{
int min = max + 1;
// trace array a & find repeating element
// with min index
for (int i = 0; i < max + 1; i++)
if (a[i] && min > a[i] && b[i])
min = a[i];
cout << arr[min];
}
cout << endl;
}
// Driver method to test above method
int main()
{
int arr[] = { 10, 5, 3, 4, 3, 5, 6 };
int n = sizeof(arr) / sizeof(arr[0]);
printFirstRepeating(arr, n);
}
Java
/* Java program to find first
repeating element in arr[] */
public class GFG
{
// This function prints the
// first repeating element in arr[]
static void printFirstRepeating(int[] arr, int n)
{
// This will set k=1, if any
// repeating element found
int k = 0;
// max = maximum from (all elements & n)
int max = n;
for (int i = 0; i < n; i++)
if (max < arr[i])
max = arr[i];
// Array a is for storing
// 1st time occurence of element
// initialized by 0
int[] a = new int[max + 1];
// Store 1 in array b
// if element is duplicate
// initialized by 0
int[] b = new int[max + 1];
for (int i = 0; i < n; i++)
{
// Duplicate element found
if (a[arr[i]] != 0)
{
b[arr[i]] = 1;
k = 1;
continue;
}
else
// storing 1st occurence of arr[i]
a[arr[i]] = i;
}
if (k == 0)
System.out.println("No repeating element found");
else
{
int min = max + 1;
// trace array a & find repeating element
// with min index
for (int i = 0; i < max + 1; i++)
if (a[i] != 0 && min > a[i] && b[i] != 0)
min = a[i];
System.out.print(arr[min]);
}
System.out.println();
}
// Driver code
public static void main(String[] args)
{
int[] arr = { 10, 5, 3, 4, 3, 5, 6 };
int n = arr.length;
printFirstRepeating(arr, n);
}
}
// This code is contributed by divyesh072019
Python3
# Python3 program to find first
# repeating element in arr[]
# This function prints the
# first repeating element in arr[]
def printFirstRepeating(arr, n):
# This will set k=1, if any
# repeating element found
k = 0
# max = maximum from (all elements & n)
max = n
for i in range(n):
if (max < arr[i]):
max = arr[i]
# Array a is for storing
# 1st time occurence of element
# initialized by 0
a = [0 for i in range(max + 1)]
# Store 1 in array b
# if element is duplicate
# initialized by 0
b = [0 for i in range(max + 1)]
for i in range(n):
# Duplicate element found
if (a[arr[i]]):
b[arr[i]] = 1
k = 1
continue
else:
# Storing 1st occurence of arr[i]
a[arr[i]] = i
if (k == 0):
print("No repeating element found")
else:
min = max + 1
for i in range(max + 1):
# Trace array a & find repeating
# element with min index
if (a[i] and (min > (a[i])) and b[i]):
min = a[i]
print(arr[min])
# Driver code
arr = [ 10, 5, 3, 4, 3, 5, 6 ]
n = len(arr)
printFirstRepeating(arr, n)
# This code is contributed by avanitrachhadiya2155
C#
/* C# program to find first
repeating element in arr[] */
using System;
class GFG
{
// This function prints the
// first repeating element in arr[]
static void printFirstRepeating(int[] arr, int n)
{
// This will set k=1, if any
// repeating element found
int k = 0;
// max = maximum from (all elements & n)
int max = n;
for (int i = 0; i < n; i++)
if (max < arr[i])
max = arr[i];
// Array a is for storing
// 1st time occurence of element
// initialized by 0
int[] a = new int[max + 1];
// Store 1 in array b
// if element is duplicate
// initialized by 0
int[] b = new int[max + 1];
for (int i = 0; i < n; i++)
{
// Duplicate element found
if (a[arr[i]] != 0)
{
b[arr[i]] = 1;
k = 1;
continue;
}
else
// storing 1st occurence of arr[i]
a[arr[i]] = i;
}
if (k == 0)
Console.WriteLine("No repeating element found");
else
{
int min = max + 1;
// trace array a & find repeating element
// with min index
for (int i = 0; i < max + 1; i++)
if ((a[i] != 0) && min > a[i] && (b[i] != 0))
min = a[i];
Console.Write(arr[min]);
}
Console.WriteLine();
}
// Driver code
static void Main()
{
int[] arr = { 10, 5, 3, 4, 3, 5, 6 };
int n = arr.Length;
printFirstRepeating(arr, n);
}
}
// This code is contributed by divyeshrabadiya07.
Javascript
Java
/*package whatever //do not write package name here */
import java.io.*;
class GFG {
public static int firstRepeated(int[] arr, int n)
{
int max = 0;
for (int x = 0; x < n; x++) {
if (arr[x] > max) {
max = arr[x];
}
}
int temp[]
= new int[max + 1]; // the idea is to use
// temporary array as hashmap
Arrays.fill(temp, 0);
for (int x = 0; x < n; x++) {
int num = arr[x];
temp[num]++;
}
for (int x = 0; x < n; x++) {
int num = arr[x];
if (temp[num] > 1) {
return x;
}
}
return -1; // if no repeating element found
}
public static void main(String[] args)
{
int[] arr = { 10, 5, 3, 4, 3, 5, 6 };
int n = arr.length;
int index = firstRepeated(
arr,
arr.length); // index Of 1st repeating number
if (index != -1) {
System.out.println("1st Repeating Number is "
+ arr[index]);
}
else {
System.out.println("No Repeating Number Found");
}
}
}
Python3
# Python3 program to find first
# repeating element in arr[]
# This function prints the
# first repeating element in arr[]
def printFirstRepeating(a, n):
for i in range(len(a)):
if a.count(a[i]) > 1:
return a[i]
return "there is no repetition number"
# Driver code
arr = [10, 5, 3, 4, 3, 5, 6]
n = len(arr)
print(printFirstRepeating(arr, n))
# This code is contributed by karthikeyakumarnallam
输出
The first repeating element is 5
另一种方法:
如果您想在不使用任何其他数据结构的情况下执行此操作。该问题也可以仅使用数组来解决。请参阅下面的方法。
C++
/* C++ program to find first
repeating element in arr[] */
#include
using namespace std;
// This function prints the
// first repeating element in arr[]
void printFirstRepeating(int arr[], int n)
{
// This will set k=1, if any
// repeating element found
int k = 0;
// max = maximum from (all elements & n)
int max = n;
for (int i = 0; i < n; i++)
if (max < arr[i])
max = arr[i];
// Array a is for storing
// 1st time occurence of element
// initialized by 0
int a[max + 1] = {};
// Store 1 in array b
// if element is duplicate
// initialized by 0
int b[max + 1] = {};
for (int i = 0; i < n; i++)
{
// Duplicate element found
if (a[arr[i]])
{
b[arr[i]] = 1;
k = 1;
continue;
}
else
// storing 1st occurence of arr[i]
a[arr[i]] = i;
}
if (k == 0)
cout << "No repeating element found" << endl;
else
{
int min = max + 1;
// trace array a & find repeating element
// with min index
for (int i = 0; i < max + 1; i++)
if (a[i] && min > a[i] && b[i])
min = a[i];
cout << arr[min];
}
cout << endl;
}
// Driver method to test above method
int main()
{
int arr[] = { 10, 5, 3, 4, 3, 5, 6 };
int n = sizeof(arr) / sizeof(arr[0]);
printFirstRepeating(arr, n);
}
Java
/* Java program to find first
repeating element in arr[] */
public class GFG
{
// This function prints the
// first repeating element in arr[]
static void printFirstRepeating(int[] arr, int n)
{
// This will set k=1, if any
// repeating element found
int k = 0;
// max = maximum from (all elements & n)
int max = n;
for (int i = 0; i < n; i++)
if (max < arr[i])
max = arr[i];
// Array a is for storing
// 1st time occurence of element
// initialized by 0
int[] a = new int[max + 1];
// Store 1 in array b
// if element is duplicate
// initialized by 0
int[] b = new int[max + 1];
for (int i = 0; i < n; i++)
{
// Duplicate element found
if (a[arr[i]] != 0)
{
b[arr[i]] = 1;
k = 1;
continue;
}
else
// storing 1st occurence of arr[i]
a[arr[i]] = i;
}
if (k == 0)
System.out.println("No repeating element found");
else
{
int min = max + 1;
// trace array a & find repeating element
// with min index
for (int i = 0; i < max + 1; i++)
if (a[i] != 0 && min > a[i] && b[i] != 0)
min = a[i];
System.out.print(arr[min]);
}
System.out.println();
}
// Driver code
public static void main(String[] args)
{
int[] arr = { 10, 5, 3, 4, 3, 5, 6 };
int n = arr.length;
printFirstRepeating(arr, n);
}
}
// This code is contributed by divyesh072019
蟒蛇3
# Python3 program to find first
# repeating element in arr[]
# This function prints the
# first repeating element in arr[]
def printFirstRepeating(arr, n):
# This will set k=1, if any
# repeating element found
k = 0
# max = maximum from (all elements & n)
max = n
for i in range(n):
if (max < arr[i]):
max = arr[i]
# Array a is for storing
# 1st time occurence of element
# initialized by 0
a = [0 for i in range(max + 1)]
# Store 1 in array b
# if element is duplicate
# initialized by 0
b = [0 for i in range(max + 1)]
for i in range(n):
# Duplicate element found
if (a[arr[i]]):
b[arr[i]] = 1
k = 1
continue
else:
# Storing 1st occurence of arr[i]
a[arr[i]] = i
if (k == 0):
print("No repeating element found")
else:
min = max + 1
for i in range(max + 1):
# Trace array a & find repeating
# element with min index
if (a[i] and (min > (a[i])) and b[i]):
min = a[i]
print(arr[min])
# Driver code
arr = [ 10, 5, 3, 4, 3, 5, 6 ]
n = len(arr)
printFirstRepeating(arr, n)
# This code is contributed by avanitrachhadiya2155
C#
/* C# program to find first
repeating element in arr[] */
using System;
class GFG
{
// This function prints the
// first repeating element in arr[]
static void printFirstRepeating(int[] arr, int n)
{
// This will set k=1, if any
// repeating element found
int k = 0;
// max = maximum from (all elements & n)
int max = n;
for (int i = 0; i < n; i++)
if (max < arr[i])
max = arr[i];
// Array a is for storing
// 1st time occurence of element
// initialized by 0
int[] a = new int[max + 1];
// Store 1 in array b
// if element is duplicate
// initialized by 0
int[] b = new int[max + 1];
for (int i = 0; i < n; i++)
{
// Duplicate element found
if (a[arr[i]] != 0)
{
b[arr[i]] = 1;
k = 1;
continue;
}
else
// storing 1st occurence of arr[i]
a[arr[i]] = i;
}
if (k == 0)
Console.WriteLine("No repeating element found");
else
{
int min = max + 1;
// trace array a & find repeating element
// with min index
for (int i = 0; i < max + 1; i++)
if ((a[i] != 0) && min > a[i] && (b[i] != 0))
min = a[i];
Console.Write(arr[min]);
}
Console.WriteLine();
}
// Driver code
static void Main()
{
int[] arr = { 10, 5, 3, 4, 3, 5, 6 };
int n = arr.Length;
printFirstRepeating(arr, n);
}
}
// This code is contributed by divyeshrabadiya07.
Javascript
输出
5
时间复杂度: O(n)。
另一种使用 O(n) 辅助空间和 O(n) 时间复杂度的方法:
Java
/*package whatever //do not write package name here */
import java.io.*;
class GFG {
public static int firstRepeated(int[] arr, int n)
{
int max = 0;
for (int x = 0; x < n; x++) {
if (arr[x] > max) {
max = arr[x];
}
}
int temp[]
= new int[max + 1]; // the idea is to use
// temporary array as hashmap
Arrays.fill(temp, 0);
for (int x = 0; x < n; x++) {
int num = arr[x];
temp[num]++;
}
for (int x = 0; x < n; x++) {
int num = arr[x];
if (temp[num] > 1) {
return x;
}
}
return -1; // if no repeating element found
}
public static void main(String[] args)
{
int[] arr = { 10, 5, 3, 4, 3, 5, 6 };
int n = arr.length;
int index = firstRepeated(
arr,
arr.length); // index Of 1st repeating number
if (index != -1) {
System.out.println("1st Repeating Number is "
+ arr[index]);
}
else {
System.out.println("No Repeating Number Found");
}
}
}
使用Python内置函数的另一种方法:
蟒蛇3
# Python3 program to find first
# repeating element in arr[]
# This function prints the
# first repeating element in arr[]
def printFirstRepeating(a, n):
for i in range(len(a)):
if a.count(a[i]) > 1:
return a[i]
return "there is no repetition number"
# Driver code
arr = [10, 5, 3, 4, 3, 5, 6]
n = len(arr)
print(printFirstRepeating(arr, n))
# This code is contributed by karthikeyakumarnallam
输出
5
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。