目录
-
- 题目
- 算法思路
- 具体代码
- 复杂度分析
- 参考
题目
算法思路
题设要求不能使用乘除法,所以(1+n)×n/2(1+n)\times n /2(1+n)×n/2平均计算方法不可以用;要求不能使用while、for、if 等关键字以及条件判断语句,所以迭代法也不可以用。
至于递归法,最容易想到的递归代码如下:
class Solution {
public int sumNums(int n) {
if(n == 1)return 1;n += sumNums(n - 1);return n;}
}
显然不可以这么写,那么问题的关键就在于如何用其他方法终止递归,我们可以利用 逻辑运算符的短路效应 ,即 A && B
如果 A 为 false 的话 B 的判断就不会执行,直接判定A && B
为 false;A || B
如果 A 为 true 的话 B 的判断就不会执行,直接判定A || B
为 true。
具体代码
注意:为了构成语句,必须添加一个辅助布尔量 x ,同理,开启下一层递归需要改写成sumNums(n - 1) > 0
。
class Solution {
int res = 0;public int sumNums(int n) {
boolean x = n > 1 && sumNums(n - 1) > 0;res += n;return res;}
}
代码简化:
class Solution {
public int sumNums(int n) {
boolean x = n > 1 && (n += sumNums(n - 1)) > 0;return n;}
}
复杂度分析
- 时间复杂度:O(n)O(n)O(n),需要开启 n 个递归函数。
- 空间复杂度:O(n)O(n)O(n),递归深度为O(n)O(n)O(n)
参考
参考