189. 轮转数组

一、常规法

思路

尾出头进

复杂度

array_unshift 移动的时间复杂度为 n

时间复杂度:O(k*n)

空间复杂度:O(1)

代码

class Solution {

    /**
     * @param Integer[] $nums
     * @param Integer $k
     * @return NULL
     */
    function rotate(&$nums, $k) {
        $i = 0;
        while($i < $k) {
            $value = array_pop($nums);
            array_unshift($nums, $value);
            $i++;
        }

        return $nums;
    }
}

二、多次反转法

思路

将倒数 k 个元素是为组B,前面的元素为组A。分别反转组A,组B,最后再反转整体即可。

注意处理一下:k 大于数组长度的问题。

复杂度

array_unshift 移动的时间复杂度为 n

时间复杂度:O(n)

空间复杂度:O(1)

代码

class Solution {

    /**
     * @param Integer[] $nums
     * @param Integer $k
     * @return NULL
     */
    function rotate(&$nums, $k) {

        $len = count($nums);
        // 当 k 大于 数组的长度,相当于只需要移动余数位
        $k = $k % $len;

        $this->reverse($nums, 0, $len - $k -1);
        $this->reverse($nums, $len - $k, $len - 1);
        $this->reverse($nums, 0, $len -1);

        return $nums;
    }

    /**
     * $arr 数组
     * $start $end 确定那段区间进行反转
     */
    function reverse(&$arr, $start, $end)
    {
        for(;$start < $end; $start++, $end--) {
            $temp = $arr[$start];
            $arr[$start] = $arr[$end];
            $arr[$end] = $temp;
        }
    }
}

results matching ""

    No results matching ""