logo

מצא אם תת-מערך הוא בצורת הר או לא

נסה את זה ב-GfG Practice ' title= #practiceLinkDiv { display: none !חשוב; }

ניתן לנו מערך של מספרים שלמים וטווח שאנו צריכים כדי למצוא האם לתת המערך הנופל בטווח הזה יש ערכים בצורת הר או לא. אומרים שכל הערכים של תת-המערך הם בצורה של הר אם כל הערכים גדלים או יורדים או קודם גדלים ואז יורדים. 
באופן רשמי יותר תת-מערך [a1 a2 a3…aN] אומרים שהוא בצורה של הר אם קיים מספר שלם K 1<= K <= N such that 
a1<= a2 <= a3 .. <= aK >= a(K+1) >= a(K+2) …. >= aN  

דוגמאות:  

  Input : Arr[]   = [2 3 2 4 4 6 3 2] Range = [0 2]   Output :    Yes   Explanation:   The output is yes  subarray is [2 3 2] so subarray first increases and then decreases   Input:    Arr[] = [2 3 2 4 4 6 3 2] Range = [2 7]   Output:   Yes   Explanation:   The output is yes  subarray is [2 4 4 6 3 2] so subarray first increases and then decreases   Input:   Arr[]= [2 3 2 4 4 6 3 2] Range = [1 3]   Output:   no   Explanation:   The output is no subarray is [3 2 4] so subarray is not in the form above stated
Recommended Practice בעיה בתת מערך הרים נסה את זה!

פִּתָרוֹן:  



    גִישָׁה:לבעיה יש מספר שאילתות ולכן עבור כל שאילתה יש לחשב את הפתרון במינימום מורכבות זמן אפשרית. אז צור שני רווחים נוספים באורך המערך המקורי. עבור כל אלמנט מצא את האינדקס האחרון בצד שמאל שהולך וגדל כלומר גדול מהאלמנט הקודם שלו ומצא את האלמנט בצד ימין יאחסן את האינדקס הראשון בצד ימין שהולך ויורד כלומר גדול מהאלמנט הבא שלו. אם ניתן לחשב ערכים אלו עבור כל אינדקס בזמן קבוע אז עבור כל טווח נתון ניתן לתת את התשובה בזמן קבוע.אַלגוֹרִיתְם: 
    1. צור שני חללים נוספים באורך נ שְׁמֹאל ו יָמִינָה ומשתנה נוסף lastptr
    2. לְאַתחֵל שמאל[0] = 0 ו lastptr = 0
    3. חצו את המערך המקורי מהאינדקס השני ועד הסוף
    4. עבור כל אינדקס בדוק אם הוא גדול מהאלמנט הקודם אם כן אז עדכן את lastptr עם המדד הנוכחי.
    5. עבור כל חנות אינדקס ה lastptr ב שמאל[i]
    6. לְאַתחֵל ימינה[N-1] = N-1 ו lastptr = N-1
    7. חצו את המערך המקורי מהאינדקס השני אחרון להתחלה
    8. עבור כל אינדקס בדוק אם הוא גדול מהרכיב הבא אם כן אז עדכן את lastptr עם המדד הנוכחי.
    9. עבור כל חנות אינדקס ה lastptr ב נכון[i]
    10. כעת עבדו את השאילתות
    11. לכל שאילתה ל ר אִם ימין[l] >= שמאל[r] ואז להדפיס כֵּן אַחֵר לֹא
    יישום:
C++
// C++ program to check whether a subarray is in // mountain form or not #include    using namespace std; // Utility method to construct left and right array int preprocess(int arr[] int N int left[] int right[]) {  // Initialize first left index as that index only  left[0] = 0;  int lastIncr = 0;  for (int i = 1; i < N; i++)  {  // if current value is greater than previous  // update last increasing  if (arr[i] > arr[i - 1])  lastIncr = i;  left[i] = lastIncr;  }  // Initialize last right index as that index only  right[N - 1] = N - 1;  int firstDecr = N - 1;  for (int i = N - 2; i >= 0; i--)  {  // if current value is greater than next  // update first decreasing  if (arr[i] > arr[i + 1])  firstDecr = i;  right[i] = firstDecr;  } } // Method returns true if arr[L..R] is in mountain form bool isSubarrayMountainForm(int arr[] int left[]  int right[] int L int R) {  // return true only if right at starting range is  // greater than left at ending range  return (right[L] >= left[R]); } // Driver code to test above methods int main() {  int arr[] = {2 3 2 4 4 6 3 2};  int N = sizeof(arr) / sizeof(int);  int left[N] right[N];  preprocess(arr N left right);  int L = 0;  int R = 2;  if (isSubarrayMountainForm(arr left right L R))  cout << 'Subarray is in mountain formn';  else  cout << 'Subarray is not in mountain formn';  L = 1;  R = 3;  if (isSubarrayMountainForm(arr left right L R))  cout << 'Subarray is in mountain formn';  else  cout << 'Subarray is not in mountain formn';  return 0; } 
Java
// Java program to check whether a subarray is in // mountain form or not class SubArray {  // Utility method to construct left and right array  static void preprocess(int arr[] int N int left[] int right[])  {  // initialize first left index as that index only  left[0] = 0;  int lastIncr = 0;    for (int i = 1; i < N; i++)  {  // if current value is greater than previous  // update last increasing  if (arr[i] > arr[i - 1])  lastIncr = i;  left[i] = lastIncr;  }    // initialize last right index as that index only  right[N - 1] = N - 1;  int firstDecr = N - 1;    for (int i = N - 2; i >= 0; i--)  {  // if current value is greater than next  // update first decreasing  if (arr[i] > arr[i + 1])  firstDecr = i;  right[i] = firstDecr;  }  }    // method returns true if arr[L..R] is in mountain form  static boolean isSubarrayMountainForm(int arr[] int left[]  int right[] int L int R)  {  // return true only if right at starting range is  // greater than left at ending range  return (right[L] >= left[R]);  }    public static void main(String[] args)  {  int arr[] = {2 3 2 4 4 6 3 2};  int N = arr.length;  int left[] = new int[N];  int right[] = new int[N];  preprocess(arr N left right);  int L = 0;  int R = 2;    if (isSubarrayMountainForm(arr left right L R))  System.out.println('Subarray is in mountain form');  else  System.out.println('Subarray is not in mountain form');    L = 1;  R = 3;    if (isSubarrayMountainForm(arr left right L R))  System.out.println('Subarray is in mountain form');  else  System.out.println('Subarray is not in mountain form');  } } // This Code is Contributed by Saket Kumar 
Python3
# Python 3 program to check whether a subarray is in # mountain form or not # Utility method to construct left and right array def preprocess(arr N left right): # initialize first left index as that index only left[0] = 0 lastIncr = 0 for i in range(1N): # if current value is greater than previous # update last increasing if (arr[i] > arr[i - 1]): lastIncr = i left[i] = lastIncr # initialize last right index as that index only right[N - 1] = N - 1 firstDecr = N - 1 i = N - 2 while(i >= 0): # if current value is greater than next # update first decreasing if (arr[i] > arr[i + 1]): firstDecr = i right[i] = firstDecr i -= 1 # method returns true if arr[L..R] is in mountain form def isSubarrayMountainForm(arr left right L R): # return true only if right at starting range is # greater than left at ending range return (right[L] >= left[R]) # Driver code  if __name__ == '__main__': arr = [2 3 2 4 4 6 3 2] N = len(arr) left = [0 for i in range(N)] right = [0 for i in range(N)] preprocess(arr N left right) L = 0 R = 2 if (isSubarrayMountainForm(arr left right L R)): print('Subarray is in mountain form') else: print('Subarray is not in mountain form') L = 1 R = 3 if (isSubarrayMountainForm(arr left right L R)): print('Subarray is in mountain form') else: print('Subarray is not in mountain form') # This code is contributed by # Surendra_Gangwar 
C#
// C# program to check whether  // a subarray is in mountain  // form or not using System; class GFG {    // Utility method to construct   // left and right array  static void preprocess(int []arr int N   int []left int []right)  {  // initialize first left   // index as that index only  left[0] = 0;  int lastIncr = 0;    for (int i = 1; i < N; i++)  {  // if current value is   // greater than previous  // update last increasing  if (arr[i] > arr[i - 1])  lastIncr = i;  left[i] = lastIncr;  }    // initialize last right   // index as that index only  right[N - 1] = N - 1;  int firstDecr = N - 1;    for (int i = N - 2; i >= 0; i--)  {  // if current value is   // greater than next  // update first decreasing  if (arr[i] > arr[i + 1])  firstDecr = i;  right[i] = firstDecr;  }  }    // method returns true if  // arr[L..R] is in mountain form  static bool isSubarrayMountainForm(int []arr int []left  int []right int L int R)  {  // return true only if right at   // starting range is greater   // than left at ending range  return (right[L] >= left[R]);  }      // Driver Code  static public void Main ()  {  int []arr = {2 3 2 4  4 6 3 2};  int N = arr.Length;  int []left = new int[N];  int []right = new int[N];  preprocess(arr N left right);    int L = 0;  int R = 2;    if (isSubarrayMountainForm(arr left   right L R))  Console.WriteLine('Subarray is in ' +   'mountain form');  else  Console.WriteLine('Subarray is not ' +   'in mountain form');    L = 1;  R = 3;    if (isSubarrayMountainForm(arr left   right L R))  Console.WriteLine('Subarray is in ' +   'mountain form');  else  Console.WriteLine('Subarray is not ' +   'in mountain form');  } } // This code is contributed by aj_36 
JavaScript
<script>  // Javascript program to check whether   // a subarray is in mountain   // form or not    // Utility method to construct   // left and right array  function preprocess(arr N left right)  {  // initialize first left   // index as that index only  left[0] = 0;  let lastIncr = 0;    for (let i = 1; i < N; i++)  {  // if current value is   // greater than previous  // update last increasing  if (arr[i] > arr[i - 1])  lastIncr = i;  left[i] = lastIncr;  }    // initialize last right   // index as that index only  right[N - 1] = N - 1;  let firstDecr = N - 1;    for (let i = N - 2; i >= 0; i--)  {  // if current value is   // greater than next  // update first decreasing  if (arr[i] > arr[i + 1])  firstDecr = i;  right[i] = firstDecr;  }  }    // method returns true if  // arr[L..R] is in mountain form  function isSubarrayMountainForm(arr left right L R)  {  // return true only if right at   // starting range is greater   // than left at ending range  return (right[L] >= left[R]);  }    let arr = [2 3 2 4 4 6 3 2];  let N = arr.length;  let left = new Array(N);  let right = new Array(N);  preprocess(arr N left right);  let L = 0;  let R = 2;  if (isSubarrayMountainForm(arr left right L R))  document.write('Subarray is in ' + 'mountain form' + '
'
); else document.write('Subarray is not ' + 'in mountain form' + '
'
); L = 1; R = 3; if (isSubarrayMountainForm(arr left right L R)) document.write('Subarray is in ' + 'mountain form'); else document.write('Subarray is not ' + 'in mountain form'); </script>
    תְפוּקָה:
Subarray is in mountain form Subarray is not in mountain form
    ניתוח מורכבות: 
      מורכבות זמן:עַל). 
      יש צורך בשתי חצות בלבד ולכן מורכבות הזמן היא O(n).מורכבות החלל:עַל). 
      נדרשים שני חללים נוספים באורך n ולכן מורכבות החלל היא O(n).


 

צור חידון