给定大小为N的数组A。任务是找到同时包含最大值和最小值的最小子数组的长度。
例子:
Input : A[] = {1, 5, 9, 7, 1, 9, 4}
Output : 2
subarray {1, 9} has both maximum and minimum value.
Input : A[] = {2, 2, 2, 2}
Output : 1
2 is both maximum and minimum here.
方法:想法是在这里使用两指针技术:
- 查找数组的最大值和最小值。
- 遍历数组并存储最后出现的最大值和最小值。
- 如果最后一次出现的最大值是pos_max ,最小值是pos_min ,则abs(pos_min – pos_max)的最小值+ 1是我们所需的答案。
下面是上述方法的实现:
C++
// C++ implementation of above approach
#include
using namespace std;
// Function to return length of
// smallest subarray containing both
// maximum and minimum value
int minSubarray(int A[], int n)
{
// find maximum and minimum
// values in the array
int minValue = *min_element(A, A + n);
int maxValue = *max_element(A, A + n);
int pos_min = -1, pos_max = -1, ans = INT_MAX;
// iterate over the array and set answer
// to smallest difference between position
// of maximum and position of minimum value
for (int i = 0; i < n; i++) {
// last occurrence of minValue
if (A[i] == minValue)
pos_min = i;
// last occurrence of maxValue
if (A[i] == maxValue)
pos_max = i;
if (pos_max != -1 and pos_min != -1)
ans = min(ans, abs(pos_min - pos_max) + 1);
}
return ans;
}
// Driver code
int main()
{
int A[] = { 1, 5, 9, 7, 1, 9, 4 };
int n = sizeof(A) / sizeof(A[0]);
cout << minSubarray(A, n);
return 0;
}
Java
// Java implementation of above approach
import java.util.*;
class GFG
{
// Function to return length of
// smallest subarray containing both
// maximum and minimum value
static int minSubarray(int A[], int n)
{
// find maximum and minimum
// values in the array
int minValue = A[0];
for(int i = 1; i < n; i++)
{
if(A[i] < minValue)
minValue = A[i];
}
int maxValue = A[0];
for(int i = 1; i < n; i++)
{
if(A[i] > maxValue)
maxValue = A[i];
}
int pos_min = -1, pos_max = -1,
ans = Integer.MAX_VALUE;
// iterate over the array and set answer
// to smallest difference between position
// of maximum and position of minimum value
for (int i = 0; i < n; i++)
{
// last occurrence of minValue
if (A[i] == minValue)
pos_min = i;
// last occurrence of maxValue
if (A[i] == maxValue)
pos_max = i;
if (pos_max != -1 && pos_min != -1)
ans = Math.min(ans,
Math.abs(pos_min - pos_max) + 1);
}
return ans;
}
// Driver code
public static void main(String args[])
{
int A[] = { 1, 5, 9, 7, 1, 9, 4 };
int n = A.length;
System.out.println(minSubarray(A, n));
}
}
// This code is contributed by
// Surendra_Gangwar
Python3
# Python3 implementation of above approach
import sys
# Function to return length of smallest
# subarray containing both maximum and
# minimum value
def minSubarray(A, n):
# find maximum and minimum
# values in the array
minValue = min(A)
maxValue = max(A)
pos_min, pos_max, ans = -1, -1, sys.maxsize
# iterate over the array and set answer
# to smallest difference between position
# of maximum and position of minimum value
for i in range(0, n):
# last occurrence of minValue
if A[i] == minValue:
pos_min = i
# last occurrence of maxValue
if A[i] == maxValue:
pos_max = i
if pos_max != -1 and pos_min != -1 :
ans = min(ans, abs(pos_min - pos_max) + 1)
return ans
# Driver code
A = [ 1, 5, 9, 7, 1, 9, 4 ]
n = len(A)
print(minSubarray(A, n))
# This code is contributed
# by Saurabh_Shukla
C#
// C# implementation of above approach
using System;
using System.Linq;
public class GFG{
// Function to return length of
// smallest subarray containing both
// maximum and minimum value
static int minSubarray(int []A, int n)
{
// find maximum and minimum
// values in the array
int minValue = A.Min();
int maxValue = A.Max();
int pos_min = -1, pos_max = -1, ans = int.MaxValue;
// iterate over the array and set answer
// to smallest difference between position
// of maximum and position of minimum value
for (int i = 0; i < n; i++) {
// last occurrence of minValue
if (A[i] == minValue)
pos_min = i;
// last occurrence of maxValue
if (A[i] == maxValue)
pos_max = i;
if (pos_max != -1 && pos_min != -1)
ans = Math.Min(ans, Math.Abs(pos_min - pos_max) + 1);
}
return ans;
}
// Driver code
static public void Main (){
int []A = { 1, 5, 9, 7, 1, 9, 4 };
int n = A.Length;
Console.WriteLine(minSubarray(A, n));
}
}
// This code is contributed by anuj_67..
PHP
输出:
2