剑指Offer:[第19天 搜索与回溯算法(中等)]--->求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

二、思路分析

注:思路分析中的一些内容和图片参考自力扣各位前辈的题解,感谢他们的无私奉献

思路

可以看出题目中的限制条件很多,可以考虑下递归。但是通常实现递归的时候我们都会利用条件判断语句来决定递归的出口,但由于题目的限制我们不能使用条件判断语句,那么我们是否能使用别的办法来确定递归出口呢?答案就是逻辑运算符的短路性质。
----以逻辑运算符&&为例,对于A&&B这个表达式,如果A表达式返回 false,那么A&&B已经确定为false,此时不会去执行表达式B。同理,对于逻辑运算符||, 对于A||B这个表达式,如果A表达式返回true,那么A||B已经确定为true,此时不会去执行表达式B
----利用这一特性,我们可以将判断是否为递归的出口看作A&&B表达式中的A部分,递归的主体函数看作B部分。如果不是递归出口,则返回true,并继续执行表达式B的部分,否则递归结束。
复杂度分析:
时间复杂度 O ( N ) \rm{O(N)} O(N):递归函数递归N次,每次递归中计算时间复杂度为O(1),因此总时间复杂度为O(n)
空间复杂度 O ( N ) \rm{O(N)} O(N):递归函数的空间复杂度取决于递归调用栈的深度,这里递归函数调用栈深度为O(N),因此空间复杂度为O(N)
注: 还有一种快速乘的方法,时间复杂度为 O ( l o g N ) \rm{O(logN)} O(logN),空间复杂度为 O ( 1 ) \rm{O(1)} O(1),后续再进行学习

三、整体代码

整体代码如下

int sumNums(int n){
    n && (n += sumNums(n-1));
    return n;
}

运行,测试通过
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知初与修一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值