在LeetCode上解决数组旋转时,我编写了一个递归算法来解决这个问题:
给定一个数组,将数组向右旋转k步,其中k为非负。
例1:
输入: Nums=[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]
例2:
输入:nums=[-1,-100,3,99],k=2输出:[3,99,-1,-100]说明:向右旋转1步:[99,-1,-100,3]向右旋转2步:[3,99,-1,-100]
约束:
1.
为了进一步澄清,这里是问题的链接。
我提出的解决方案如下:
class Solution {
public void rotate(int[] nums, int k) {
rotateArr(nums, nums.length, k % nums.length, 0);
}
public static void rotateArr(int[] arr, int len, int steps, int current) {
if (len <= steps) {
return;
}
rotateArr(arr, len - 1, steps, current + 1);
int stepsTaken = 0;
int i = current;
int temp;
while (stepsTaken < steps) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
i++;
stepsTaken++;
}
}
}
根据我对解的分析,函数RotateArr()将首先除以nums.length-k倍。在那之后,它开始征服,这将发生在nums.length-k 1步,在每一步它执行k操作。总结我们得到的一切:
虽然我有一个二次项,但它是一个常数,因此我相信我的运行时是O(n)。
我想知道以下内容:
Utkarsh Tiwari,我认为你的分析是不正确的。根据我的计算,征服步骤将发生在A.长度-k
次,而不是A.长度-k 1
。
让我们考虑一下你提到的第二个输入数组:
[-1, -100, 3, 99]
这里,对rotatarray(A,4,2,0)
的第一个调用发生在main()
方法中。第二个递归调用是:rotatarray(A,3,2,1)
,最后一个是:rotatarray(A,2,2)
。
但是,在最后一次递归调用中,由于基本条件得到满足,所以征服不会发生。
if(length <= steps) return.
该函数将简单地返回最后一次,而不执行任何重要步骤。因此,所有的k
操作数量将只发生在前两个递归调用中,这是根据表达式A.长度-k
或4-2
在这种情况下。
因此,时间复杂度
将是(A.长-k)*k
。
现在,让我们看看您提供的约束:
1
-2^31
0
这里,
k
不是常数。它的可能值甚至超过了nums.length
的最大值。时间复杂度
取决于A. long
和k
的值。如果k
的可能值在5到20之间,它将是O(nums.length)
。但是,在当前约束条件下,它可以接受一个超过A. long
的值。
让我们注意一下实现中的另一个微妙细节。在对
rotatarray()
的第一次调用中,您将k%A.length
作为参数之一传递。现在,k
的可能值降低为:
0 <= k < A.length
如果我们选择k的值作为A.长度/2,并输入时间复杂度,我们得到:
(A.length - A.length/2) * A.length
这将减少到
O(A.length^2)
,这将是最糟糕的情况复杂性
。
我希望我帮助过你。如果在解决方案中遇到任何问题,请发表评论。
本文向大家介绍PHP实现数组递归转义的方法,包括了PHP实现数组递归转义的方法的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式讲述了PHP实现数组递归转义的方法,分享给大家供大家参考之用。具体方法如下: 主要功能代码如下: 希望本文所述对大家的PHP程序设计有所帮助。
问题内容: 我有一个我要为类创建的程序,该程序使用递归返回数组中所有整数的总和。到目前为止,这是我的程序: 但是,我相信我得到了三个都相关的错误,但是我不知道为什么它会找到一种null类型: 问题答案: 该解决方案比看起来简单,请尝试以下操作(假设数组的长度为非零): 这样称呼它:
我试图写一个方法,找出第一个位置和最后一个位置之间有多少奇数。该方法接受一个数组,然后在低位和高位接受两个int。此方法需要递归生成。这是我到目前为止的情况。下面是方法调用和int数组。我得到的输出是1,但答案应该是2。
编写一个名为mySplit的函数,该函数接受int数组,并调用递归引用函数。函数MySplit应该检查数组中的数字是否可以分为2组, > 不要忽略或添加第一个数组中的数字 所有5的倍数必须在同一组中。 所有3的重复数(而不是5的倍数)必须在第二组中。 我开始写代码,但我正在寻找一些不同的想法。所有内容都应该写在递归函数中,布尔函数应该只返回true或false 示例: 我的代码:
通过运行上面的程序i得到的输出,这是错误的,实际输出是
问题内容: 我还没有找到满足我的功能特定需求的任何东西,是的,这是用于家庭作业。 所以我有: 前提条件:x.length> 0 我不能让函数返回任何东西,而唯一的参数是数组这一事实使我感到困惑。 我已经尝试过将循环与递归一起使用,但是我尝试过的一切似乎都以生成函数的无限实例结束。 我已经有了一个想法/建议与该函数一起使用另一个函数,但是,当前如何递归地使用原始函数超出了我的范围。 任何帮助表示赞赏