Dada una array arr[] de enteros positivos, la tarea es encontrar si es posible hacer que esta array sea estrictamente decreciente modificando como máximo un elemento.
Ejemplos:
Entrada: arr[] = {12, 9, 10, 5, 2}
Salida: Sí
{12, 11, 10, 5, 2} es una de las soluciones válidas.
Entrada: arr[] = {1, 2, 3, 4}
Salida: No
Enfoque: Para cada elemento arr[i] , si es mayor que arr[i – 1] y arr[i + 1] o es más pequeño que arr[i – 1] y arr[i + 1] entonces arr [i] necesita ser modificado.
es decir , arr[i] = (arr[i – 1] + arr[i + 1]) / 2 . Si después de la modificación, arr[i] = arr[i – 1] o arr[i + 1] , entonces la array no se puede hacer estrictamente decreciente sin afectar como máximo a un elemento; de lo contrario, cuente todas esas modificaciones, si el recuento de modificaciones al final es menor o igual a 1 , entonces imprima Sí , de lo contrario imprima No.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Function that returns true if the array // can be made strictly decreasing // with at most one change bool check(vector<int> arr, int n) { // To store the number of modifications // required to make the array // strictly decreasing int modify = 0; // Check whether the last element needs // to be modify or not if (arr[n - 1] >= arr[n - 2]) { arr[n - 1] = arr[n - 2] - 1; modify++; } // Check whether the first element needs // to be modify or not if (arr[0] <= arr[1]) { arr[0] = arr[1] + 1; modify++; } // Loop from 2nd element to the 2nd last element for (int i = n - 2; i > 0; i--) { // Check whether arr[i] needs to be modified if ((arr[i - 1] <= arr[i] && arr[i + 1] <= arr[i]) || (arr[i - 1] >= arr[i] && arr[i + 1] >= arr[i])) { // Modifying arr[i] arr[i] = (arr[i - 1] + arr[i + 1]) / 2; modify++; // Check if arr[i] is equal to any of // arr[i-1] or arr[i+1] if (arr[i] == arr[i - 1] || arr[i] == arr[i + 1]) return false; } } // If more than 1 modification is required if (modify > 1) return false; return true; } // Driver code int main() { vector<int> arr = { 10, 5, 11, 2 }; int n = arr.size(); if (check(arr, n)) cout << "Yes"; else cout << "No"; return 0; }
Java
// Java implementation of the approach class GFG { // Function that returns true if the array // can be made strictly decreasing // with at most one change public static boolean check(int[] arr, int n) { // To store the number of modifications // required to make the array // strictly decreasing int modify = 0; // Check whether the last element needs // to be modify or not if (arr[n - 1] >= arr[n - 2]) { arr[n - 1] = arr[n - 2] - 1; modify++; } // Check whether the first element needs // to be modify or not if (arr[0] <= arr[1]) { arr[0] = arr[1] + 1; modify++; } // Loop from 2nd element to the 2nd last element for (int i = n - 2; i > 0; i--) { // Check whether arr[i] needs to be modified if ((arr[i - 1] <= arr[i] && arr[i + 1] <= arr[i]) || (arr[i - 1] >= arr[i] && arr[i + 1] >= arr[i])) { // Modifying arr[i] arr[i] = (arr[i - 1] + arr[i + 1]) / 2; modify++; // Check if arr[i] is equal to any of // arr[i-1] or arr[i+1] if (arr[i] == arr[i - 1] || arr[i] == arr[i + 1]) return false; } } // If more than 1 modification is required if (modify > 1) return false; return true; } // Driver code public static void main(String[] args) { int[] arr = { 10, 5, 11, 3 }; int n = arr.length; if (check(arr, n)) System.out.print("Yes"); else System.out.print("No"); } }
Python3
# Python3 implementation of the approach # Function that returns true if the array # can be made strictly decreasing # with at most one change def check(arr, n): modify = 0 # Check whether the last element needs # to be modify or not if (arr[n - 1] >= arr[n - 2]): arr[n-1] = arr[n-2] - 1 modify += 1 # Check whether the first element needs # to be modify or not if (arr[0] <= arr[1]): arr[0] = arr[1] + 1 modify += 1 # Loop from 2nd element to the 2nd last element for i in range(n-2, 0, -1): # Check whether arr[i] needs to be modified if (arr[i - 1] <= arr[i] and arr[i + 1] <= arr[i]) or \ (arr[i - 1] >= arr[i] and arr[i + 1] >= arr[i]): # Modifying arr[i] arr[i] = (arr[i - 1] + arr[i + 1]) // 2 modify += 1 # Check if arr[i] is equal to any of # arr[i-1] or arr[i + 1] if (arr[i] == arr[i - 1] or arr[i] == arr[i + 1]): return False # If more than 1 modification is required if (modify > 1): return False return True # Driver code if __name__ == "__main__": arr = [10, 5, 11, 3] n = len(arr) if (check(arr, n)): print("Yes") else: print("No")
C#
// C# implementation of the approach using System; class GFG { // Function that returns true if the array // can be made strictly decreasing // with at most one change public static bool check(int[]arr, int n) { // To store the number of modifications // required to make the array // strictly decreasing int modify = 0; // Check whether the last element needs // to be modify or not if (arr[n - 1] >= arr[n - 2]) { arr[n - 1] = arr[n - 2] - 1; modify++; } // Check whether the first element needs // to be modify or not if (arr[0] <= arr[1]) { arr[0] = arr[1] + 1; modify++; } // Loop from 2nd element to the 2nd last element for (int i = n - 2; i > 0; i--) { // Check whether arr[i] needs to be modified if ((arr[i - 1] <= arr[i] && arr[i + 1] <= arr[i]) || (arr[i - 1] >= arr[i] && arr[i + 1] >= arr[i])) { // Modifying arr[i] arr[i] = (arr[i - 1] + arr[i + 1]) / 2; modify++; // Check if arr[i] is equal to any of // arr[i-1] or arr[i+1] if (arr[i] == arr[i - 1] || arr[i] == arr[i + 1]) return false; } } // If more than 1 modification is required if (modify > 1) return false; return true; } // Driver code static public void Main () { int[]arr = { 10, 5, 11, 3 }; int n = arr.Length; if (check(arr, n)) Console.Write("Yes"); else Console.Write("No"); } } // This code is contributed by ajit.
Javascript
<script> // Javascript implementation of the approach // Function that returns true if the array // can be made strictly decreasing // with at most one change function check(arr, n) { // To store the number of modifications // required to make the array // strictly decreasing let modify = 0; // Check whether the last element needs // to be modify or not if (arr[n - 1] >= arr[n - 2]) { arr[n - 1] = arr[n - 2] - 1; modify++; } // Check whether the first element needs // to be modify or not if (arr[0] <= arr[1]) { arr[0] = arr[1] + 1; modify++; } // Loop from 2nd element to the 2nd last element for (let i = n - 2; i > 0; i--) { // Check whether arr[i] needs to be modified if ((arr[i - 1] <= arr[i] && arr[i + 1] <= arr[i]) || (arr[i - 1] >= arr[i] && arr[i + 1] >= arr[i])) { // Modifying arr[i] arr[i] = parseInt((arr[i - 1] + arr[i + 1]) / 2, 10); modify++; // Check if arr[i] is equal to any of // arr[i-1] or arr[i+1] if (arr[i] == arr[i - 1] || arr[i] == arr[i + 1]) return false; } } // If more than 1 modification is required if (modify > 1) return false; return true; } let arr = [ 10, 5, 11, 3 ]; let n = arr.length; if (check(arr, n)) document.write("Yes"); else document.write("No"); </script>
Yes
Complejidad temporal: O(N)
Espacio auxiliar: O(1)
Publicación traducida automáticamente
Artículo escrito por sanjeev2552 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA