剑指 offer 64 求1+2+…+n
递归
class Solution {
public int sumNums(int n) {
boolean flag = n>0 && (n+=sumNums(n-1))>0;
return n;
}
}
时间复杂度
O
(
n
)
O(n)
O(n)。
空间复杂度
O
(
n
)
O(n)
O(n),递归函数的空间复杂度取决于递归调用栈的深度,这里递归函数调用栈深度为
O
(
n
)
O(n)
O(n),因此空间复杂度是
O
(
n
)
O(n)
O(n)。
快速乘
用到了俄罗斯农民乘法
class Solution {
public int sumNums(int n) {
int A = n;
int B = n+1;
int ans = 0;
boolean flag;
//1
flag = ((B&1)>0)&&(ans+=A)>0;
B>>=1;
A<<=1;
//2
flag = ((B&1)>0)&&(ans+=A)>0;
B>>=1;
A<<=1;
//3
flag = ((B&1)>0)&&(ans+=A)>0;
B>>=1;
A<<=1;
//4
flag = ((B&1)>0)&&(ans+=A)>0;
B>>=1;
A<<=1;
//5
flag = ((B&1)>0)&&(ans+=A)>0;
B>>=1;
A<<=1;
//6
flag = ((B&1)>0)&&(ans+=A)>0;
B>>=1;
A<<=1;
//7
flag = ((B&1)>0)&&(ans+=A)>0;
B>>=1;
A<<=1;
//8
flag = ((B&1)>0)&&(ans+=A)>0;
B>>=1;
A<<=1;
//9
flag = ((B&1)>0)&&(ans+=A)>0;
B>>=1;
A<<=1;
//10
flag = ((B&1)>0)&&(ans+=A)>0;
B>>=1;
A<<=1;
//11
flag = ((B&1)>0)&&(ans+=A)>0;
B>>=1;
A<<=1;
//12
flag = ((B&1)>0)&&(ans+=A)>0;
B>>=1;
A<<=1;
//13
flag = ((B&1)>0)&&(ans+=A)>0;
B>>=1;
A<<=1;
//14
flag = ((B&1)>0)&&(ans+=A)>0;
B>>=1;
A<<=1;
ans >>=1;
return ans;
}
}
时间复杂度
O
(
log
n
)
O(\log n)
O(logn),快速乘需要的时间复杂度为
O
(
log
n
)
O(\log n)
O(logn)。
空间复杂度
O
(
1
)
O(1)
O(1),只需要常数空间存放若干变量。