Maksimum orta ölçülü K uzunluğu subarrayını tapın

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Amazon google
GeyimBaxılıb 328

Problem bəyanat

Maksimum orta problemin K uzunluğu alt hissəsini tapdıqda, bir verdik array ölçüsü N. verilən orta ölçülü k ölçülü massivdə subarrayın başlanğıc mövqeyini tapmaq. Dizidə müsbət və mənfi rəqəmlər ola bilər. (Orta = elementlərin cəmi / element sayı). Alt massivlər bir sıra alt dəstləridir.

misal

Input

8 3

[1, 3, 4, 5, 7, 8, -10, -11]

Buraxılış

3

Izahat

Burada maksimum orta subarray cəmi 5 + indeksindən başlayan 7 + 8 + 20 = 3/3 təşkil edir.

Yanaşma 1

Alqoritm

1 Adım: K> n olarsa, “Mümkün olan ölçüdə belə bir subarray yoxdur” yazdırır. Çünki ölçüsündən daha böyük bir sıra ola bilməz.

2 Adım: Sum_here = 0, max_sum = INT_MIN başlatırıq

3 Adım: Elementlərin cəmini k ölçüsündə olan bütün subraylarda tapırıq və max_sum ilə əgər max_sum varsa müqayisə edirik

a. 0-dan NK-ya (birinci döngə) 0-dan K-1-ə (ikinci döngə) qədər subarların cəmini tapmaq üçün iki döngə işlədirik. İkinci döngədə, k ölçüsündə olan bütün subarların cəmini tapmaq üçün buraya cəmləmək üçün bütün elementləri əlavə edirik.
b. Max_sum

4 Adım:  Maksimum orta subarrayın başlanğıcı olan pos_max-ı çap edirik.

Həyata keçirilməsi

Maksimum Ortalama K Uzunluğu Alt Dizisini Tapmaq üçün C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;
int main()
{
  int N,K;
  cin>>N>>K;
  int arr[N];
  for(int i=0;i<N;i++)
  {
      cin>>arr[i];
  }
  if(K>N)
  {
    cout <<"No such subarray with that size possible\n";
    return -1;	
  }	
  int max_sum=INT_MIN; //to store the maximum sum of such subarray with size K
  int sum_here=0,pos_max; //maximum sum and starting position of such subarray respectively
  for(int i=0; i<=N-K;i++)
  {
      sum_here=0;
    for(int j =0; j<K; j++)
      sum_here += arr[i+j];
      
    if(sum_here > max_sum)
    {
      max_sum = sum_here;
      pos_max = i;
    }
  }
  cout<<"Maximum average subarray starts from index "<<pos_max;
}

Maksimum Ortalama K Uzunluğu Subarrayını Tapmaq üçün Java Proqramı

import java.util.Scanner;

class sum
{
    public static int main(String[] args)  
    { 
        Scanner sr = new Scanner(System.in);
        int N = sr.nextInt();
        int K = sr.nextInt();
        int arr[] = new int[N];
        for(int i=0;i<N;i++)
        {
            arr[i] = sr.nextInt();
        }
        if(K>N)
        {
          System.out.println("No such subarray with that size possible");
          return -1;  
        }  
        int max_sum=-1; //to store the maximum sum of such subarray with size K
        int sum_here=0, pos_max = 0; //maximum sum and starting position of such subarray respectively
        for(int i=0; i<=N-K;i++)
        {
            sum_here=0;
          for(int j =0; j<K; j++)
            sum_here += arr[i+j];

          if(sum_here > max_sum)
          {
            max_sum = sum_here;
            pos_max = i;
          }
        }
        System.out.println("Maximum average subarray starts from index " + pos_max);
        return 0;
    }
}
8 3
1 3 4 5 7 8 -10 -11
Maximum average subarray starts from index 3

Maksimum Orta K K Uzunluğu Subarrayını Tapmaq üçün Mürəkkəblik Analizi

Zaman mürəkkəbliyi 

O (n * k) burada n - massivin ölçüsü, k - subarray ölçüsüdür. Burada nk ədədləri üçün k dəfə keçirik. Beləliklə, gətirilən hesablamada, zamanın mürəkkəbliyinin O (n * k) olduğunu söyləyirik.

Kosmik Mürəkkəblik

O (1) çünki burada yalnız bəzi dəyişənlərdən istifadə edirik.

Yanaşma 2

Bu yanaşmada ilk k elementlərinin cəmini alırıq və bunu maksimum cəm ​​kimi edirik və dizini keçirik ki, alt sətrin növbəti elementini cəmləşdirək və birinci elementi cəmini yaradan alt sətir cəminə çıxaq. yeni subarray.
maksimum cəm ​​ilə müqayisə edin və maksimum cəm ​​yeni subray cəmindən azdırsa, maksimum cəmi yeniləyin və alt sətrin başlanğıc vəziyyətini saxlayın. bunu serialın sonuna qədər davam etdirin.

Alqoritm

1 Adım: Əvvəlcə k ölçüsündə ilk subrayın cəmini hesablayırıq və sum_here-də saxlayırıq və maksimum cəmi sum_here-ə yeniləyirik.

a. Max_sum-u bir tam ədədin minimum dəyərinə başlayın, belə ki, heç biri ondan kiçik olmasın. (INT_MIN istifadə)
b. Max funksiyasından istifadə edərək ilk k elementlərinin cəminə max_sum-u yeniləyin. (maks (A, B))

2 Adım: İndi ilk elementi çıxarıb indiki elementi əlavə edərək serialı keçirik.

a. İndeksin dəyərini K ilə başlayın.
b. Burada indeks götürürük və N-ə qədər artırırıq və indeksin hər bir dəyəri üçün indiki indeks elementini əlavə edən və ilk elementi çıxartan sum_here tapırıq.

c. Bunu indeks N-dən az olana qədər edirik

3 Adım: Maksimum cəmi tapmaq üçün hər bir indeks dəyərində cəmi və burada max_sum ilə müqayisə edirik. max_sum-u yeniləyirik və mövqeyi əldə edirik.

a. Sum_here-ni max_sum ilə müqayisə edirik və əgər sum_here max_sum-dan böyükdürsə. İndi max_sum'u sum_here olaraq yeniləyirik. Verilən uzunluq subarrayının max_sumunu əldə edəcəyik.
b. Maksimum alt dizinin başlanğıc göstəricisi olan mövqeyi indeks - K + 1 etməklə əldə edirik.

Maksimum Orta K K Uzunluqlu Subarray tapın izahı

arr [] = {1, 12, -5, -6, 50, 3}

Burada n-nin dəyəri 6, k-nin int dəyəri 2-dir.

Başlamaq:
Sum_ burada = = 1 + 12 = 13
Buna görə burada max_sum = 13.
Index = 2-ni başladırıq, <6 indeksinə qədər sum_here-ni max_sum ilə müqayisə edirik

İndeks üçün = 2.
Sum_ burada = 13 - 1 + (-5) = 7
7> 13 -> Yanlış

İndeks üçün = 3.
Sum_here = 7 - 12 + (-6) = -11
-11> 1 -> Yanlış
Buna görə max_sum = 2 və subarray mövqeyi = 2.

İndeks üçün = 4.
Sum_here = -11 - (-5) + 50 = 44
44> 13 -> Doğrudur
Buna görə max_sum = 44 və subarray mövqeyi = 3.

Axırıncı.

Sum_here = 44 - (-6) + 3 = 53
53> 44 -> Doğrudur
Buna görə max_sum = 53 və subarray mövqeyi = 4.
Max_sum = 53 yazdırır və subarray başlanğıc mövqeyi = 4-dir.
Buna görə, 2 ölçüsünün maksimum subrayı 4 mövqedən başlayır.

Həyata keçirilməsi

Maksimum Ortalama K Uzunluğu Alt Dizisini Tapmaq üçün C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;
int main()
{
  int N,K;
  cin>>N>>K;
  int arr[N];
  for(int i=0;i<N;i++)
  {
      cin>>arr[i];
  }
  if(K > N)
  {
      cout <<"No such subarray with that size possible\n";
      return -1;  
  }  
  int max_sum = INT_MIN; //to store the maximum sum of such subarray with size K
  int sum_here = 0;
  for(int i = 0; i < K; i++)
    sum_here += arr[i]; //compute sum of the first subarray with size K
    
  max_sum = max(max_sum,sum_here); //update the maximum sum
  
  int index = K,pos_max = 0; //index from where to traverse and pos_max is the starting position of such subarray
  
  while(index < N) //traverse the left array by eliminating the first element from sum and adding the current element and updating maximum sum accordingly
  {
    sum_here = sum_here - arr[index - K] + arr[index];
    if(sum_here > max_sum) //if we get a larger sum of subarray then update both maximum sum and starting index of such subarray
    {
      max_sum = sum_here;
      pos_max = index - K +1;//starting index of subarray
    }
  index++;
  }
  
  cout<<"Maximum average subarray starts from index "<<pos_max;
}

Maksimum Ortalama K Uzunluğu Subarrayını Tapmaq üçün Java Proqramı

import static java.lang.Integer.max;
import java.util.Scanner;

class sum
{
    public static void main(String[] args)  
    { 
        Scanner sr = new Scanner(System.in);
        int N = sr.nextInt();
        int K = sr.nextInt();
        int arr[] = new int[N];
        for(int i=0;i<N;i++)
        {
            arr[i] = sr.nextInt();
        }
        if(K>N)
        {
          System.out.println("No such subarray with that size possible");
        }else{  
        int max_sum=-1; //to store the maximum sum of such subarray with size K
        int sum_here=0;
        for(int i = 0; i < K; i++)
        sum_here += arr[i]; //compute sum of the first subarray with size K
        max_sum = max(max_sum,sum_here); //update the maximum sum
        int index = K,pos_max = 0; //index from where to traverse and pos_max is the starting position of such subarray

        while(index < N) //traverse the left array by eliminating the first element from sum and adding the current element and updating maximum sum accordingly
        {
          sum_here = sum_here - arr[index - K] + arr[index];
          if(sum_here > max_sum) //if we get a larger sum of subarray then update both maximum sum and starting index of such subarray
          {
            max_sum = sum_here;
            pos_max = index - K +1;//starting index of subarray
          }
        index++;
        }
        System.out.println("Maximum average subarray starts from index " + pos_max);
        }
    }
}
6 2
1 12 -5 -6 50 3
Maximum average subarray starts from index 4

Maksimum Orta K K Uzunluğu Subarrayını Tapmaq üçün Mürəkkəblik Analizi

Zaman mürəkkəbliyi

O (n) burada n serialın ölçüsüdür. Burada bütün massivi gəzirik və 1-ci dizidən sonra sabit zaman içində k ölçüsündə alt dizinin cəmini tapırıq.

Kosmik mürəkkəblik

O (1) çünki son cavabı hesablamaq üçün bəzi dəyişənlərdən istifadə edirik.

References

Translate »