📌  相关文章
📜  包含最小值和最大值的最小子数组

📅  最后修改于: 2021-05-04 07:41:49             🧑  作者: Mango

给定大小为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