0 cəmi ilə bütün subrayları çap edin

Çətinlik səviyyəsi Ağır
Tez-tez soruşulur Amazon Pulsuz yükləmə Həqiqətən Məlumat kənarı microsoft OYO Otaqları
Geyim SükutBaxılıb 42

Sizə tam bir sıra verilir, tapşırığınız cəmi 0-a bərabər olan bütün mümkün alt diziləri çap etməkdir. Beləliklə, 0 cəmi ilə bütün subarları çap etməliyik.

misal

0 cəmi ilə bütün subrayları çap edinPin

arr[] = {-2, 4, -2, -1, 1, -3, 1, 5, 7, -11, -6}
Sub-Array found from 0 index to 2 index
Sub-Array found from 0 index to 4 index
Sub-Array found from 3 index to 4 index
Sub-Array found from 1 index to 6 index
Sub-Array found from 4 index to 9 index

Alqoritm

  1. 0 cəmi ilə alt serialın izini saxlamaq üçün bəzi dəyişənlərlə "Cəm" deyilən sıra elementlərinin cəmini tapın.
  2. If Məbləğ 0 olduğu aşkar edildikdə, mövcud indeksin 0-dan indeksə qədər tapılması deməkdir.
  3. Yoxsa yoxlayın Məbləğ yuxarıdakı prosesdən tapılan, bizimdə mövcuddur xəritə və ya deyil.
  4. Xəritədə cəmi varsa, bu əvvəlki alt massivin cəmi olduğu deməkdir və cari indekslərə qədər elementin Cəmi olur.
  5. Cari Cəmi xəritəyə əlavə edin.

Izahat

İstifadə edəcəyik qarışdırma çünki bununla alt dizilərə və indekslərə baxa bilərik. Ayrıca, fərqli kolleksiyalardan istifadə edəcəyik. Əvvəlcə, cədvəldə mümkün olan cəmi 0 olan cəmi XNUMX təşkil edən bütün rəqəmləri tapmaq məcburiyyətindəyik. Bunun üçün massivin elementlərini toplayaraq toplamağa saxlayacağıq. Məbləğ əvvəldən başlanğıcda hazırlanırdı.

Müvəqqəti cəmi açar, dəyəri isə vektor olan bir xəritə yaradacağıq. Beləliklə, burada vektor girişin başlanğıcından elementlərin cəminin cari cəmə bərabər olduğu indeksləri təmsil edir.

Bundan sonra serialın üstündən keçməyə başlayırıq. Beləliklə, irəlilədikcə elementləri dəyişən cəmə əlavə etməyə davam edirik. Əgər məbləğ hər an 0 olduğu təsbit edildi. Deməli, bu başlanğıcdan başlayaraq alt sıra 0-a bərabərdir. Həm də cəmi 0-a bərabər olan bəzi göstəricilər tapsaydı.

Cəmi sıfır olaraq tapılmırsa. Sonra Xəritədə həmin məbləğin olub-olmadığını yoxlayırıq. Xəritədə hesablanmış məbləğ yoxdursa. O zaman cari indekslə bitən və cəmi 0 olan hər hansı bir subarray mövcud deyil. Beləliklə, cari indeksdə bitən və 0-a bərabər bir cəmi olan bütün alt diziləri tapdıqdan sonra cari cəmi açar kimi göstərən xəritə.

Ancaq Xəritə cəmi ehtiva edirsə, o deməkdir ki, eyni cəmi olan əvvəlki alt massivləri tapdıq. Sonra həmin cəmin və indekslərin dəyərini əlavə etməliyik.

Bunun xaricində bir vektor elan etdiyimiz siyahımızı qaytarırıq. Oradan qaytarma dəyəri 0 ölçüsünə sahibdirsə, başqa heç bir şey tapılmadığını göstərir, çıktı yazdırılmayacaq.

Bütün subarları 0 cəmlə çap etmək üçün C ++ kodu

#include<iostream>
#include<unordered_map>
#include<vector>

using namespace std;
vector< pair<int, int> > getSubArray(int arr[], int n)
{
  unordered_map<int, vector<int> > Map;
  vector <pair<int, int>> result;
  int sum = 0;
  for (int i = 0; i < n; i++)
  {
    sum += arr[i];
    if (sum == 0)
      result.push_back(make_pair(0, i));
        if (Map.find(sum) != Map.end())
    {
      vector<int> vec = Map[sum];
      for (auto val = vec.begin(); val != vec.end(); val++)
        result.push_back(make_pair(*val + 1, i));
    }
    Map[sum].push_back(i);
  }
  return result;
}
void print(vector<pair<int, int>> result)
{
  for (auto j= result.begin(); j != result.end(); j++)
    cout << "Sub-Array found from " << j->first << " index to " << j->second <<" index"<< endl;
}
int main()
{
    int arr[] = {-2, 4, -2, -1, 1, -3, 1, 5, 7, -11, -6};
    int n = sizeof(arr)/sizeof(arr[0]);
  vector<pair<int, int> > result = getSubArray(arr, n);
  if (result.size() == 0)
    cout << "No such Sub-array exists";
  else
    print(result);

  return 0;
}
Sub-Array found from 0 index to 2 index
Sub-Array found from 0 index to 4 index
Sub-Array found from 3 index to 4 index
Sub-Array found from 1 index to 6 index
Sub-Array found from 4 index to 9 index

0 cəmi ilə bütün subrayları yazdırmaq üçün Java kodu

import java.util.*;
class Pair
{
    int start, end;
    Pair(int a, int b)
    {
        start = a;
        end = b;
    }
}
class printSubArray0Sum
{
    public static ArrayList<Pair> getSubArray(int[] arr, int n)
    {
        HashMap<Integer,ArrayList<Integer>> map = new HashMap<>();
        ArrayList<Pair> temp = new ArrayList<>();
        int sum = 0;
        for (int i = 0; i < n; i++)
        {
            sum += arr[i];
            if (sum == 0)
                temp.add(new Pair(0, i));
            ArrayList<Integer> list = new ArrayList<>();
            if (map.containsKey(sum))
            {
                list = map.get(sum);
                for (int j = 0; j < list.size(); j++)
                {
                    temp.add(new Pair(list.get(j) + 1, i));
                }
            }
            list.add(i);
            map.put(sum, list);
        }
        return temp;
    }
    public static void print(ArrayList<Pair> result)
    {
        for (int i = 0; i < result.size(); i++)
        {
            Pair pair = result.get(i);
            System.out.println("Sub-Array found from "+ pair.start + " index to " + pair.end+" index");
        }
    }
    public static void main(String args[])
    {
        int[] arr = {-2, 4, -2, -1, 1, -3, 1, 5, 7, -11, -6};
        int n = arr.length;

        ArrayList<Pair> result = getSubArray(arr, n);
        if (result.size() == 0)
            System.out.println("No such Sub-array exists");
        else
            print(result);
    }
}
Sub-Array found from 0 index to 2 index
Sub-Array found from 0 index to 4 index
Sub-Array found from 3 index to 4 index
Sub-Array found from 1 index to 6 index
Sub-Array found from 4 index to 9 index

Mürəkkəblik təhlili

Zamanın mürəkkəbliyi

O (n) hara "N" massivdəki elementlərin sayıdır.

Kosmik Mürəkkəblik

O (n) hara "N" massivdəki elementlərin sayıdır.

Translate »