#practiceLinkDiv { display: none !important; }Ni se oferă o matrice de numere întregi și un interval de care trebuie să aflăm dacă subbarra care se încadrează în acest interval are valori sub formă de munte sau nu. Se spune că toate valorile subbaryului sunt sub forma unui munte dacă fie toate valorile cresc sau descresc, fie mai întâi cresc și apoi descresc.
Mai formal, un subbary [a1 a2 a3…aN] se spune a fi sub forma unui munte dacă există un întreg K 1<= K <= N such that
a1<= a2 <= a3 .. <= aK >= a(K+1) >= a(K+2) …. >= aN
cum se convertesc int în șir de caractere java
Exemple:
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 statedRecommended Practice Problema Muntelui Subarray Încearcă!
Soluţie:
- Creați două spații suplimentare de lungime n stânga şi corect și o variabilă suplimentară lastptr
- Inițializați stânga[0] = 0 și lastptr = 0
- Traversați matricea originală de la al doilea index până la sfârșit
- Pentru fiecare index verificați dacă este mai mare decât elementul anterior, dacă da, apoi actualizați lastptr cu indicele curent.
- Pentru fiecare index stocați lastptr în stânga[i]
- inițializați dreapta[N-1] = N-1 și lastptr = N-1
- Traversați matricea originală de la ultimul index până la început
- Pentru fiecare index verificați dacă este mai mare decât următorul element, dacă da, apoi actualizați lastptr cu indicele curent.
- Pentru fiecare index stocați lastptr în corect[eu]
- Acum procesați interogările
- pentru fiecare interogare l r dacă dreapta[l] >= stânga[r] apoi tipăriți Da altfel nu
// 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
Sunt necesare doar două traversări, astfel încât complexitatea timpului este O(n).
Sunt necesare două spații suplimentare de lungime n, astfel încât complexitatea spațiului este O(n).