给定大小为N的数组arr [] 。任务是为从1到N的每个i在除arr [i]之外的N-1个元素中找到最大元素。
例子:
Input: arr[] = {2, 5, 6, 1, 3}
Output: 6 6 5 6 6
Input: arr[] = {1, 2, 3}
Output: 3 3 2
方法:一种有效的方法是制作最大元素的前缀和后缀数组,并在arr [i]以外的N – 1个元素中找到最大元素。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to find maximum element
// among (N - 1) elements other than
// a[i] for each i from 1 to N
int max_element(int a[], int n)
{
// To store prefix max element
int pre[n];
pre[0] = a[0];
for (int i = 1; i < n; i++)
pre[i] = max(pre[i - 1], a[i]);
// To store suffix max element
int suf[n];
suf[n - 1] = a[n - 1];
for (int i = n - 2; i >= 0; i--)
suf[i] = max(suf[i + 1], a[i]);
// Find the maximum element
// in the array other than a[i]
for (int i = 0; i < n; i++) {
if (i == 0)
cout << suf[i + 1] << " ";
else if (i == n - 1)
cout << pre[i - 1] << " ";
else
cout << max(pre[i - 1], suf[i + 1]) << " ";
}
}
// Driver code
int main()
{
int a[] = { 2, 5, 6, 1, 3 };
int n = sizeof(a) / sizeof(a[0]);
max_element(a, n);
return 0;
}
Java
// Java implementation of the approach
class GFG
{
// Function to find maximum element
// among (N - 1) elements other than
// a[i] for each i from 1 to N
static void max_element(int a[], int n)
{
// To store prefix max element
int []pre = new int[n];
pre[0] = a[0];
for (int i = 1; i < n; i++)
pre[i] = Math.max(pre[i - 1], a[i]);
// To store suffix max element
int []suf = new int[n];
suf[n - 1] = a[n - 1];
for (int i = n - 2; i >= 0; i--)
suf[i] = Math.max(suf[i + 1], a[i]);
// Find the maximum element
// in the array other than a[i]
for (int i = 0; i < n; i++)
{
if (i == 0)
System.out.print(suf[i + 1] + " ");
else if (i == n - 1)
System.out.print(pre[i - 1] + " ");
else
System.out.print(Math.max(pre[i - 1],
suf[i + 1]) + " ");
}
}
// Driver code
public static void main(String []args)
{
int a[] = { 2, 5, 6, 1, 3 };
int n = a.length;
max_element(a, n);
}
}
// This code is contributed by Rajput-Ji
Python3
# Python3 implementation of the approach
# Function to find maximum element
# among (N - 1) elements other than
# a[i] for each i from 1 to N
def max_element(a, n) :
# To store prefix max element
pre = [0] * n;
pre[0] = a[0];
for i in range(1, n) :
pre[i] = max(pre[i - 1], a[i]);
# To store suffix max element
suf = [0] * n;
suf[n - 1] = a[n - 1];
for i in range(n - 2, -1, -1) :
suf[i] = max(suf[i + 1], a[i]);
# Find the maximum element
# in the array other than a[i]
for i in range(n) :
if (i == 0) :
print(suf[i + 1], end = " ");
elif (i == n - 1) :
print(pre[i - 1], end = " ");
else :
print(max(pre[i - 1],
suf[i + 1]), end = " ");
# Driver code
if __name__ == "__main__" :
a = [ 2, 5, 6, 1, 3 ];
n = len(a);
max_element(a, n);
# This code is contributed by AnkitRai01
C#
// C# implementation of the approach
using System;
class GFG
{
// Function to find maximum element
// among (N - 1) elements other than
// a[i] for each i from 1 to N
static void max_element(int []a, int n)
{
// To store prefix max element
int []pre = new int[n];
pre[0] = a[0];
for (int i = 1; i < n; i++)
pre[i] = Math.Max(pre[i - 1], a[i]);
// To store suffix max element
int []suf = new int[n];
suf[n - 1] = a[n - 1];
for (int i = n - 2; i >= 0; i--)
suf[i] = Math.Max(suf[i + 1], a[i]);
// Find the maximum element
// in the array other than a[i]
for (int i = 0; i < n; i++)
{
if (i == 0)
Console.Write(suf[i + 1] + " ");
else if (i == n - 1)
Console.Write(pre[i - 1] + " ");
else
Console.Write(Math.Max(pre[i - 1],
suf[i + 1]) + " ");
}
}
// Driver code
public static void Main(String []args)
{
int []a = { 2, 5, 6, 1, 3 };
int n = a.Length;
max_element(a, n);
}
}
// This code is contributed by PrinciRaj1992
输出:
6 6 5 6 6