እኩል ቁጥር 0 እና 1 ቁጥር ያላቸው ትልቁ ንዑስ  


የችግር ደረጃ መካከለኛ
ውስጥ በተደጋጋሚ ተጠየቀ አማዞን Coursera ግሬይ ብርቱካናማ MakeMyTrip ሞርጋን ስታንሊ Paytm Synopsys ታይምስ በይነመረብ
ሰልፍ ሃሽ

ብዙ ቁጥር ያላቸው ቁጥሮች ይሰጡዎታል። ኢንቲጀሮች በግብዓት ድርድር ውስጥ 0 እና 1 ብቻ ናቸው። የችግር መግለጫው 0 እና 1 እኩል ሊቆጠር የሚችል ትልቁን ንዑስ ክፍል ለማወቅ ይጠይቃል ፡፡

ለምሳሌ  

arr[]={0,1,0,1,0,1,1,1}
0 to 5 (total 6 elements)

ማስረጃ

ከድርድር አቀማመጥ 0 እስከ 5 እኩል 0 እና 1 እኩል አልነበረም

0 ቶች ቆጠራ 3

1 ቶች ቆጠራ ⇒ 3

እና ይህ 0s እና 1s እኩል እኩል የሚይዝ ትልቁ ንዑስ ድርድር ነው ፡፡

ከ 0 እና 1 እኩል ቁጥር ጋር ትልቁን ንዑስ ክፍልን ለማግኘት ስልተ ቀመር  

  1. ያውጅ ሀ ሃሽ ማፕ.
  2. አዘጋጅ ድምር, ከፍተኛ ርዝመት, የመነሻ ጽሑፍ ወደ 0 እና መጨረሻ ማውጫ እስከ -1.
  3. ድርድሩን አቋርጠው እያንዳንዱን የድርድር አካል ከ -1 ጋር እኩል ከሆነ -0 ን ያዘምኑ።
  4. ዑደት ከ 0 እስከ n-1 ይጀምሩ (n የድርድሩ ርዝመት ነው)።
    1. እያንዳንዱን የአር [i] እሴት ወደ ድምር ያክሉ።
    2. ድምርው ከ 0 ጋር እኩል መሆኑን ያረጋግጡ ፣ እውነት ከሆነ ፣
      1. ከዚያ ያዘምኑ ከፍተኛ ርዝመት እንደ እኔ + 1 ፣ እና መጨረሻ ማውጫ እንደ እኔ
    3. ካርታው በውስጡ ድምር + n ን የያዘ መሆኑን ያረጋግጡ ፣
      1. ከዚያ የከፍተኛው ርዝመት እንደ እሴት i - ካርታ (ድምር + n) ከካርታው ላይ ያዘምኑ እና EndIndex ን እንደ እኔ ፡፡
    4. ሌላ ያንን ድምር + n ወደ ካርታው አስገባችው።
  5. የህትመት መጨረሻ ማውጫ - maxLength + 1 እና EndIndex ን ያትሙ።
ተመልከት
የዛፍ ተሻጋሪ (ቅድመ-ቅደም ተከተል ፣ ኢንደር እና ፖስትደር)

ማስረጃ  

አንድ ድርድር ከተሰጠን እና ትልቁን ንዑስ-ድርድር በእኩል ቁጥር 0 እና 1s እንዲያገኝ እንጠየቃለን ፡፡ የ 0 እና 1 እኩል ቁጥሮችን ከሚይዙ ሁሉም ንዑስ-ድርድሮች ሁሉ ርዝመቶች ሁሉ ትልቁ መሆን እንዲችል ንዑስ-አደራደሩን ክልል ይፈልጉ ፡፡ እኛ የምንጠቀምበትን ነው ሃሽ ማፕ ለማከማቸት ኢንቲጀር በውስጡ ያሉ እሴቶች ሃምሽንግ ቀልጣፋ አቀራረብን እና የተሻለ ጊዜ ውስብስብነትን ይሰጣል ፡፡ እሴቶቹን ውሰድ ድምር, ከፍተኛ ርዝመት እንደ 0 ከዚያም በኮዱ ውስጥ በተመሳሳይ ጊዜ እናዘምነዋለን ፡፡ EndIndex የሚባል አንድ ተለዋዋጭ ይኖረናል ፣ ይህ የከፍተኛው ንዑስ-ድርድር ጫፎች ከፍተኛው ርዝመት መሆን ያለበት የክልሉን የመጨረሻ ነጥብ ዋጋ ይይዛል ፡፡

ከድርድሩ ዋጋ ማናቸውም ከ 0 ጋር እኩል መሆን አለመሆኑን ለመፈለግ ድርደራውን ያቋርጡ ፣ ከዚያ -1 የሚል ምልክት እናደርጋለን ፣ እና በውስጡ ያለውን 1 የያዘውን የድርድር ዋጋን እንተወዋለን። ምክንያቱም እዚህ ትክክለኛውን ክልል አናገኝም ፡፡ አመክንዮው እኩል ዜሮዎችን እና እኩል ርዝመትን እንኳን ሳይቀር መቁጠር ነው ፡፡ ስለዚህ 0 ን እንደ -1 ምልክት እናደርጋለን ፣ እና እሴቶቹን በድርድሩ ውስጥ ስናክል ፡፡ ድምርን 0 ካገኘን ፣ አንድ ጥንድ እኩል እና ዜሮዎችን አግኝተናል ማለት ነው ፣ ምክንያቱም እያንዳንዱ -1 እና 1 እያንዳንዳችንን 0 እንደ -0 ምልክት ካደረግን ጀምሮ ድምር 1 ያደርጉታል ፣ ስለሆነም እኛ ልንቆጥረው እንችላለን ፡፡

በአንድ ድርድር ውስጥ እያንዳንዱን እሴት ለማጠቃለል እንሄዳለን እና ከ 0 ጋር እኩል ከሆነ እናገኛለን ፣ እኩል ከሆነ የከፍታውን ርዝመት እና የመደምደሚያውን የመጨረሻ ደረጃ ማዘመን ብቻ ነው ፡፡ ድምርው + n ቀድሞውኑ ከሌለ በካርታው ላይ እናደርጋለን ፣ ካለ ደግሞ አንዳንድ ሁኔታዎችን ይፈትሹ እና ከዚያ የ MaxLength እና EndIndex ዋጋን ያዘምኑ። የክልሉን መነሻ እና የመጨረሻውን መጨረሻ እንደ የክልል መጨረሻ ነጥብ - ከፍተኛ ርዝመት + 1 ያትሙ።

ተመልከት
የተገናኙ ዝርዝር ንጥረ ነገሮችን Leetcode መፍትሄን ያስወግዱ

እኩል ቁጥር 0 እና 1 ቁጥር ያላቸው ትልቁ ንዑስጭንቅላታም መያያዣ መርፌ

ኮድ  

ከ 0 እና 1 እኩል ቁጥር ጋር ትልቁን ንዑስ ክፍል ለማግኘት የ C ++ ኮድ

#include<iostream>
#include<unordered_map>

using namespace std;

int getLargestSubA(int arr[], int n)
{
    unordered_map<int, int> MAP;

    int sum = 0;
    int maxLength = 0;
    int endingIndex = -1;

    for (int i = 0; i < n; i++)
        arr[i] = (arr[i] == 0) ? -1 : 1;

    for (int i = 0; i < n; i++)
    {
        sum += arr[i];
        if (sum == 0)
        {
            maxLength = i + 1;
            endingIndex = i;
        }
        if (MAP.find(sum + n) != MAP.end())
        {
            if (maxLength < i - MAP[sum + n])
            {
                maxLength = i - MAP[sum + n];
                endingIndex = i;
            }
        }
        else
            MAP[sum + n] = i;
    }
    cout<<endingIndex - maxLength + 1 <<" to " <<endingIndex;

    return maxLength;
}

int main()
{
    int arr[] = { 0,1,0,1,0,1,1,1 };
    int n = sizeof(arr) / sizeof(arr[0]);

    getLargestSubA(arr, n);
    return 0;
}
0 to 5

በእኩል 0 እና 1 ቁጥሮች ብዛት ትልቁን ንዑስ ክፍልን ለማግኘት በጃቫ ውስጥ መተግበር

import java.util.HashMap;

class LargestSubArrayWithEqual01
{
    public static int getLargestSubA(int arr[], int n)
    {
        HashMap<Integer, Integer> MAP = new HashMap<Integer, Integer>();

        int sum = 0;

        int maxLength = 0;
        int endingIndex = -1;

        for (int i = 0; i < n; i++)
        {
            arr[i] = (arr[i] == 0) ? -1 : 1;
        }

        for (int i = 0; i < n; i++)
        {
            sum += arr[i];
            if (sum == 0)
            {
                maxLength = i + 1;
                endingIndex = i;
            }
            if (MAP.containsKey(sum + n))
            {
                if (maxLength < i - MAP.get(sum + n))
                {
                    maxLength = i - MAP.get(sum + n);
                    endingIndex = i;
                }
            }
            else
                MAP.put(sum + n, i);

        }
        int end = endingIndex - maxLength + 1;
        System.out.println(end + " to " + endingIndex);

        return maxLength;
    }
    
    public static void main(String[] args)
    {
        int arr[] = {0,1,0,1,0,1,1,1};
        int n = arr.length;

        getLargestSubA(arr, n);
    }
}
0 to 5

ውስብስብነት ትንተና  

የጊዜ ውስብስብነት

ሆይ (n) የት “N” በድርድሩ ውስጥ ያሉት ንጥረ ነገሮች ብዛት ነው። ሀሽ ማፕን ስለተጠቀምን እዚህ በኦ (n) ውስጥ ይህንን ችግር መፍታት እንችላለን ፡፡ ምክንያቱም ሃሽማፕ በ (1) የጊዜ ውስብስብነት ውስጥ አባላትን ማስገባት ፣ መሰረዝ ወይም መቀየር ይችላል።

ተመልከት
አንድ ድርድር የሌላ ድርድር ንዑስ መሆኑን ይፈልጉ

የቦታ ውስብስብነት

ሆይ (n) የት “N” በድርድሩ ውስጥ ያሉት ንጥረ ነገሮች ብዛት ነው። በጣም በከፋ ሁኔታ ውስጥ ወደ ሃስማፕ የሚገቡ ንጥረ ነገሮች ብዛት ቢበዛ n ስለሚሆን ነው ፡፡ ይህ መስመራዊ የቦታ ውስብስብነት ተገኝቷል።