PROBLEM
剑指 Offer 64. 求1+2+…+n
难度 中等
MY ANSWER
使用&&来结束递归,时间空间复杂度都为O(n)。
class Solution { public: int sumNums(int n) { n && (n += sumNums(n-1)); return n; } };
|
BETTER SOLUTION
题目对n进行了范围限制,所以可以手动展开进行二进制乘法运算,时间复杂度为O(logn),空间复杂度O(1)。
乘法原理为:1011 * 101 = 1011 * 100 + 1011 * 1 = 55。同样使用&&进行条件判断。
class Solution { public: int sumNums(int n) { int ans = 0, A = n, B = n + 1;
(B & 1) && (ans += A); A <<= 1; B >>= 1;
(B & 1) && (ans += A); A <<= 1; B >>= 1;
(B & 1) && (ans += A); A <<= 1; B >>= 1;
(B & 1) && (ans += A); A <<= 1; B >>= 1;
(B & 1) && (ans += A); A <<= 1; B >>= 1;
(B & 1) && (ans += A); A <<= 1; B >>= 1;
(B & 1) && (ans += A); A <<= 1; B >>= 1;
(B & 1) && (ans += A); A <<= 1; B >>= 1;
(B & 1) && (ans += A); A <<= 1; B >>= 1;
(B & 1) && (ans += A); A <<= 1; B >>= 1;
(B & 1) && (ans += A); A <<= 1; B >>= 1;
(B & 1) && (ans += A); A <<= 1; B >>= 1;
(B & 1) && (ans += A); A <<= 1; B >>= 1;
(B & 1) && (ans += A); A <<= 1; B >>= 1;
return ans >> 1; } };
|
SUMMARY
- 使用&&的短路效应(前面为假不进行后面的操作)来进行条件判断
- 通过位运算实现二进制乘法