Dada una array arr[] de tamaño N y un valor K ( -10^5<K<10^5 ) , la tarea es imprimir la array rotada K veces a la derecha.
Ejemplos:
Entrada: arr = {1, 3, 5, 7, 9}, K = 2
Salida: 7 9 1 3 5
Explicación:
Array giratoria 1 vez a la derecha: 9, 1, 3, 5, 7
Array giratoria 2 vez a la derecha: 7 , 9, 1, 3, 5Entrada: arr = {1, 2, 3, 4, 5}, K = -2
Salida: 3 4 5 1 2
Explicación:
Array giratoria -1 vez a la derecha: 2, 3, 4, 5, 1
Array giratoria -2 veces derecha: 3, 4, 5, 1, 2
Enfoque ingenuo: el enfoque de fuerza bruta para resolver este problema es usar una array temporal para rotar la array K o -K veces.
Complejidad temporal: O(N)
Espacio auxiliar: O(1)
Enfoque eficiente: el problema dado se puede resolver dividiéndolo en las siguientes partes:
- Redondee el valor de K en el rango [0, N), siguiendo los pasos a continuación:
- Si K es negativo, primero cámbielo a positivo, encuentre el módulo con N y luego cámbielo nuevamente a negativo
- Si K es positivo, solo encuentra el módulo con N
- Manejar el caso cuando K es negativo. Si K es negativo, significa que necesitamos rotar la array K veces a la izquierda o -K veces a la derecha.
- A continuación, podemos simplemente rotar el arreglo K veces invirtiendo los subarreglos. Se pueden seguir los siguientes pasos para resolver el problema:
- Invierta todos los elementos de la array de 1 a N -1
- Invierta los elementos de la array de 1 a K – 1
- Invierta los elementos de la array de K a N -1
C++
// C++ implementation for the above approach #include <bits/stdc++.h> using namespace std; // Function to rotate the array // to the right, K times void RightRotate(vector<int>& nums, int K) { int n = nums.size(); // Case when K > N or K < -N K = K < 0 ? ((K * -1) % n) * -1 : K % n; // Case when K is negative K = K < 0 ? (n - (K * -1)) : K; // Reverse all the array elements reverse(nums.begin(), nums.end()); // Reverse the first k elements reverse(nums.begin(), nums.begin() + K); // Reverse the elements from K // till the end of the array reverse(nums.begin() + K, nums.end()); } // Driver code int main() { // Initialize the array vector<int> Array = { 1, 2, 3, 4, 5 }; // Find the size of the array int N = Array.size(); // Initialize K int K = -2; // Call the function and // print the answer RightRotate(Array, K); // Print the array after rotation for (int i = 0; i < N; i++) { cout << Array[i] << " "; } cout << endl; return 0; }
Java
// Java implementation for the above approach import java.util.*; class GFG{ // Initialize the array static int[] Array = { 1, 2, 3, 4, 5 }; static void reverse( int start, int end) { // Temporary variable to store character int temp; while (start <= end) { // Swapping the first and last character temp = Array[start]; Array[start] = Array[end]; Array[end] = temp; start++; end--; } } // Function to rotate the array // to the right, K times static void RightRotate( int K) { int n = Array.length; // Case when K > N or K < -N K = K < 0 ? ((K * -1) % n) * -1 : K % n; // Case when K is negative K = K < 0 ? (n - (K * -1)) : K; // Reverse all the array elements reverse(0, n-1); // Reverse the first k elements reverse(0, n - K); // Reverse the elements from K // till the end of the array reverse( K, n-1); } // Driver code public static void main(String[] args) { // Find the size of the array int N = Array.length; // Initialize K int K = -2; // Call the function and // print the answer RightRotate(K); // Print the array after rotation for (int i = 0; i < N; i++) { System.out.print(Array[i]+ " "); } System.out.println(); } } // This code is contributed by Rajput-Ji
Python3
# Python code for the above approach # Function to rotate the array # to the right, K times def RightRotate(nums, K) : n = len(nums) # Case when K > N or K < -N K = ((K * -1) % n) * -1 if K < 0 else K % n; # Case when K is negative K = (n - (K * -1)) if K < 0 else K; # Reverse all the array elements nums.reverse(); # Reverse the first k elements p1 = nums[0:K] p1.reverse(); # Reverse the elements from K # till the end of the array p2 = nums[K:] p2.reverse(); arr = p1 + p2 return arr; # Driver code # Initialize the array Array = [1, 2, 3, 4, 5]; # Find the size of the array N = len(Array) # Initialize K K = -2; # Call the function and # print the answer Array = RightRotate(Array, K); # Print the array after rotation for i in Array: print(i, end=" ") # This code is contributed by Saurabh jaiswal
C#
// C# implementation for the above approach using System; public class GFG { // Initialize the array static int[] Array = { 1, 2, 3, 4, 5 }; static void reverse(int start, int end) { // Temporary variable to store character int temp; while (start <= end) { // Swapping the first and last character temp = Array[start]; Array[start] = Array[end]; Array[end] = temp; start++; end--; } } // Function to rotate the array // to the right, K times static void RightRotate(int K) { int n = Array.Length; // Case when K > N or K < -N K = K < 0 ? ((K * -1) % n) * -1 : K % n; // Case when K is negative K = K < 0 ? (n - (K * -1)) : K; // Reverse all the array elements reverse(0, n - 1); // Reverse the first k elements reverse(0, n - K); // Reverse the elements from K // till the end of the array reverse(K, n - 1); } // Driver code public static void Main(String[] args) { // Find the size of the array int N = Array.Length; // Initialize K int K = -2; // Call the function and // print the answer RightRotate(K); // Print the array after rotation for (int i = 0; i < N; i++) { Console.Write(Array[i] + " "); } Console.WriteLine(); } } // This code is contributed by Rajput-Ji
Javascript
<script> // JavaScript code for the above approach // Function to rotate the array // to the right, K times function RightRotate(nums, K) { let n = nums.length; // Case when K > N or K < -N K = K < 0 ? ((K * -1) % n) * -1 : K % n; // Case when K is negative K = K < 0 ? (n - (K * -1)) : K; // Reverse all the array elements nums = nums.reverse(); // Reverse the first k elements let p1 = nums.slice(0, K) p1 = p1.reverse(); // Reverse the elements from K // till the end of the array let p2 = nums.slice(K) p2 = p2.reverse(); let arr = p1.concat(p2); return arr; } // Driver code // Initialize the array let Array = [1, 2, 3, 4, 5]; // Find the size of the array let N = Array.length; // Initialize K let K = -2; // Call the function and // print the answer Array = RightRotate(Array, K); // Print the array after rotation for (let i = 0; i < N; i++) { document.write(Array[i] + " "); } document.write('<br>') // This code is contributed by Potta Lokesh </script>
3 4 5 1 2
Complejidad temporal: O(N)
Espacio auxiliar: O(1)