1.0计算斐波那契数列递归fib的空间复杂度

//计算斐波那契数列递归fib的空间复杂度
long long Fib(size_t N)
{
  if(N<3)
    return 1;
  return Fib(N-1)+Fib(N-2);
}

注:空间是可以重复利用的,不累计的;但是时间是一去不复返,累计的

递归调用分析:

关于复杂度的习题(消失的数字)_复杂度

正是因为空间复杂度可以重复利用,所以斐波那契数列的空间复杂度是O(N)

2.0这道题是leetCode上的面试题

关于复杂度的习题(消失的数字)_斐波那契数列_02

注:这道题的解决方法有很多,关于复杂度我们目的不是怎样解决出这个问题,而是要分析出每种方法的复杂度,选择复杂度优的方法即可,这就是复杂度在实际中的意义。

思路一:排序(用qsort函数快排)-->判断相邻之间相差是不是1

思路一时间复杂度:O(n*log2N)

思路二:(0+1+2+3+....+n)-(a[0]+a[1]+a[2]+...+a[n-1])

思路二时间复杂度:O(n)

思路三:异或:

             给一个值x=0

             x先跟[1,n]的所有值异或, 再跟数组中的每个值异或,最后x就是那个缺的数字

思路三时间复杂度:O(n)

综上:法二和法三符合题意,所以这里我将法三的代码写一下

int missingNumber(int* nums, int numsSize)
{
    int x = 0;
    int i = 0;
    for(i=0;i<=numsSize;i++)
    {
        x = i^x;
    }
    for(i=0;i<numsSize;i++)
    {
        x^=nums[i];
    }
    return x;
}

其他方法感兴趣可以自己尝试尝试写一下。