[LeetCode](面试题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

解题思路

1)直接计算要使用运算符号,迭代要使用 while 或者 for 关键字,因此这两个都不能使用。
2)再说递归,不能使用 if 关键字来终止递归,所以要考虑其他办法终止递归,也就是逻辑运算符的短路性质。
常见的逻辑运算符有三种,即 “与 && ”,“或 || ”,“非 ! ”,而其有重要的短路效应:

if(A&&B)  // 若 A 为 false ,则 B 的判断不会执行(即短路),直接判定 A&&B 为false;
if(A||B) // 若 A 为 true ,则 B 的判断不会执行(即短路),直接判定 A||B 为 true。

利用这一特性,我们可以将判断是否为递归的出口看作 A&&B 表达式中的 A 部分,递归的主体函数看作 B 部分。如果不是递归出口,则 A=true,并继续执行表达式 B 的部分,否则递归结束。
本题需要实现 “当 n=1 时终止递归” 的需求,可通过上述的短路效应来实现:

n>1 && sumNums(n - 1) // 当 n = 1 时 n > 1 不成立 ,此时“短路”,终止后续递归;否则执行后半部分。

复杂度分析:
时间复杂度:O(n)。递归函数递归 n 次,每次递归中计算时间复杂度为 O(1),因此总时间复杂度为 O(n)。
空间复杂度:O(n)。递归函数的空间复杂度取决于递归调用栈的深度,这里递归函数调用栈深度为 O(n),因此空间复杂度为 O(n)。

代码

class Solution {
    public int sumNums(int n) {
        boolean flag = n > 1 && (n += sumNums(n-1))>0;
        return n;
    }
}

你可能感兴趣的:(剑指offer刷题笔记)