当前位置: 首页 > 后端技术 > PHP

今日算法:旋转数组

时间:2023-03-29 14:10:32 PHP

题目:给定一个数组,将数组中的元素向右移动k个位置,其中k是一个非负数。示例1:输入:[1,2,3,4,5,6,7]andk=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]示例2:输入:[-1,-100,3,99]andk=2输出:[3,99,-1,-100]解释:向右旋转1步:[99,-1,-100,3]向右旋转2步:[3,99,-1,-100]解释:想出尽可能多的解法,至少有3种不同的方法可以解决这个问题。尝试使用具有O(1)空间复杂度的就地算法。方案一:暴力法思维分析:遍历两次,先旋转k次,每次将数组旋转一个元素(将数组中的每个元素与最后一个元素值交换)PHP代码实现:/***@paramInteger[]$nums*@paramInteger$k*@returnNULL*/functionrotate(&$nums,$k){for($i=0;$i<$k;$i++){$last=$nums[计数($nums)-1];对于($j=0;$j=$start;$i--){array_unshift($res,$nums[$i]);}return$res;}复杂度分析:时间复杂度:O(n),其中n为k,只遍历k次空间复杂度:O(n)使用新的数组空间解法五:哈希函数思路分析:先截取第一个n-k个元素放入一个新的数组,然后截取最后的k个元素进入另一个新的数组,最后将两个数组倒序合并,实现PHP代码:/***@paramInteger[]$nums*@paramInteger$k*@returnNULL*/functionrotate(&$nums,$k){$res_start=array_slice($nums,0,count($nums)-$k);$res_end=array_slice($nums,count($nums)-$k,$k);returnarray_merge($res_end,$res_start);}复杂度分析:时间复杂度:O(n)空间复杂度:O(n)使用新数组空间github后,每题解法都会上传到本项目LeetCode_PHP:https://github.com/zhangdejian/LeetCode_PHP题目来源LeetCode:https://leetcode-cn.com/probl...