❓ 剑指 Offer 64. 求1+2+…+n
难度:中等
求 1+2+...+n
,要求不能使用乘除法
、for
、while
、if
、else
、switch
、case
等关键字及 条件判断语句(A?B:C
)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
限制:
1 <= n <= 10000
💡思路:
使用递归解法最重要的是指定返回条件,但是本题无法直接使用
if
语句来指定返回条件。
条件与 &&
具有短路原则,即在第一个条件语句为 false
的情况下不会去执行第二个条件语句。
- 利用这一特性,将递归的返回条件
取非
然后作为&&
的 第一个条件语句,递归的主体转换为 第二个条件语句; - 那么当递归的返回条件为
true
的情况下就不会执行递归的主体部分,递归返回。- 本题的递归返回条件为
n <= 0
,取非后就是n > 0
; - 递归的主体部分为
sum += Sum_Solution(n - 1)
,转换为条件语句后就是(sum += Sum_Solution(n - 1)) > 0
。
- 本题的递归返回条件为
注意:Java 中,为构成语句,需加一个辅助布尔量
xxx
,否则会报错;
🍁代码:(C++、Java)
C++
class Solution {
public:
int sumNums(int n) {
n && (n += sumNums(n - 1));
return n;
}
};
Java
class Solution {
public int sumNums(int n) {
boolean flag = (n > 0) && ((n += sumNums(n - 1)) > 0);
return n;
}
}
🚀 运行结果:
🕔 复杂度分析:
- 时间复杂度:
O
(
n
)
O(n)
O(n),递归函数递归
n
次,每次递归中计算时间复杂度为 O ( 1 ) O(1) O(1),因此总时间复杂度为 O ( n ) O(n) O(n)。 - 空间复杂度: O ( n ) O(n) O(n),递归函数的空间复杂度取决于递归调用栈的深度,这里递归函数调用栈深度为 O ( n ) O(n) O(n),因此空间复杂度为 O ( n ) O(n) O(n)。
题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!