2019-03-27 吴亲库里 库里的深夜食堂
给定一个数组,将数组向右旋转K步,k为非负数.返回新的数组。
**案例1给定[1,2,3,4,5,6,7],k是3,返回[5,6,7,1,2,3,4],也就是说k是多少就把数组的后k位转移到数组的前k位,形成新的数组.**
先使用php函数来实现一波,很简单的道理, 移动几个,我就从后几个删除几位,依次插入到数组的头部,两个数组函数搞定。
/**
* @param Integer[] $nums
* @param Integer $k
* @return NULL
*/
function rotate(&$nums, $k) {
while($k>0){
array_unshift($nums,array_pop($nums));
$k--;
}
}
我们定义一个辅助的数组,然后通过关系的映射来实现移动元素间的位置值交换。
/**
* @param Integer[] $nums
* @param Integer $k
* @return NULL
*/
function rotate(&$nums, $k) {
$data=$nums;
for($i=0;$i<count($nums);$i++) {
$nums[($i+$k)% count($nums)]=$data[$i];
}
}
题目说让我们使用O(1)的空间完成,解法2中空间复杂度已然是O(n),所以再换一个。正如我所说的,就是后面的k个元素移到数组前面,前面的元素往后移,所以思路就是,先反转整个数组,然后反转前k个元素,最后在反转剩下的元素。
/**
* @param Integer[] $nums
* @param Integer $k
* @return NULL
*/
function rotate(&$nums, $k) {
$k %=count($nums);
$this->reverse($nums,0,count($nums)-1);
$this->reverse($nums,0,$k-1);
$this->reverse($nums,$k,count($nums)-1);
}
function reverse(&$nums,$start,$end){
while($start<$end){
$res=$nums[$start];
$nums[$start]=$nums[$end];
$nums[$end]=$res;
$start++;
$end--;
}
}