[Una pregunta del día] Likou 189. Gire la matriz

Descripción del título ( portal )

Dada una matriz, mueva los elementos de la matriz k posiciones a la derecha, donde k es un número no negativo.

Ejemplo 1:

输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1: [7,1,2,3,4,5,6]
向右旋转 2: [6,7,1,2,3,4,5]
向右旋转 3: [5,6,7,1,2,3,4]

Ejemplo 2:

输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释: 
向右旋转 1: [99,-1,-100,3]
向右旋转 2: [3,99,-1,-100]

Descripción:

Piense en tantas soluciones como sea posible Hay al menos tres formas diferentes de resolver este problema.
Es necesario utilizar un algoritmo in situ con una complejidad espacial de O (1).

Ideas para resolver problemas

Esta pregunta trata sobre la rotación de una matriz unidimensional. Se mencionó anteriormente cuando se rotó la matriz bidimensional. Puede consultar la [Pregunta diaria] Likou 48. Rotar imagen

Idea: para que una matriz unidimensional mueva k posiciones a la derecha, puede voltear el primer nk-1 y luego voltear el todo después de nk. La rotación de la matriz unidimensional se puede realizar in situ. (El límite específico se determina de acuerdo con cómo el título define el subíndice).
Nota: Cuando el elemento de la matriz es menor o igual a 1, simplemente regrese directamente, cuando el valor de k sea mayor que la longitud de la matriz, simplemente muevak% de longitud

Inserte la descripción de la imagen aquí

Código Java

class Solution {
    
    
    public void rotateHelper(int[] nums, int left, int right) {
    
    
        while (left < right) {
    
    
            int tmp = nums[left];
            nums[left] = nums[right];
            nums[right] = tmp;
            left++;
            right--;
        }
    }
    public void rotate(int[] nums, int k) {
    
    
        if (nums.length <= 1) {
    
    
            return;
        }
        k = k%nums.length;
        rotateHelper(nums, 0, nums.length-k-1);
        rotateHelper(nums, nums.length-k, nums.length-1);
        rotateHelper(nums, 0, nums.length-1);
    }
}

Código de lenguaje C

void reverse(int* nums,int start,int end)
{
    
    
    
    for(int j=0;start<end;j++)
    {
    
    
       int tmp=nums[end];
        nums[end]=nums[start];
        nums[start]=tmp;
        start++;
        end--;
    }
    

}

void rotate(int* nums, int numsSize, int k)
{
    
    
    reverse(nums,0,numsSize-1);
   if(k>numsSize)
   {
    
    
       k%=numsSize;
   } 
    reverse(nums,0,k-1);
    reverse(nums,k,numsSize-1);
}


Supongo que te gusta

Origin blog.csdn.net/weixin_45532227/article/details/112346191
Recomendado
Clasificación