<空间复杂度>题目练习《数据结构(C语言版)》

目录

题目:

【单选题】

1.如果一个函数的栈空间中只定义了一个二维数组a[3][6],请问这个函数的空间复杂度为( )

2.分析以下函数的空间复杂度( )

【编程题】

3.旋转数组。Oj链接

4.原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。OJ链接

解析:

后记:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                                           ——By 作者:新晓·故知


题目:

【单选题】

1.如果一个函数的栈空间中只定义了一个二维数组a[3][6],请问这个函数的空间复杂度为( )

A.O(n)

B.O(n^2)

C.O( 1 )

D.O(m*n)

2.分析以下函数的空间复杂度( )

int** fun(int n)
{
    int** s = (int**)malloc(n * sizeof(int*));
    while (n--)
        s[n] = (int*)malloc(n * sizeof(int));
    return s;
}

A.O(n)

B.O(n^2)

C.O( 1 )

D.O(nlogn)

【编程题】

3.旋转数组。Oj链接

4.原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。OJ链接

解析:

1.答案:C

解析:常数空间,空间复杂度都为1

2.答案:B

解析:

此处开辟的是一个二维数组,数组有n行,每行分别有1,2,3,...n列,所以是n(n + 1)/2个元素空间,空间复杂度为n^2

3.

解1:

/*
解题思路:使用三次逆转法,让数组旋转k次
1. 先整体逆转
2. 逆转子数组[0, k - 1]
3. 逆转子数组[k, size - 1]
*/
void reverse(int* nums, int begin, int end)
{
    while (begin < end)
    {
        int tmp = nums[begin];
        nums[begin] = nums[end];
        nums[end] = tmp;

        ++begin;
        --end;
    }
}

// 三趟逆置倒的思路
void rotate(int* nums, int numsSize, int k) {
    if (k > numsSize)
    {
        k %= numsSize;
    }

    reverse(nums, 0, numsSize - 1);
    reverse(nums, 0, k - 1);
    reverse(nums, k, numsSize - 1);
}

解2:

void rotate(int* nums, int numsSize, int k) 
{
    int newArr[numsSize];
    for (int i = 0; i < numsSize; ++i)
 {
        newArr[(i + k) %numsSize] = nums[i];
    }
    for (int i = 0; i < numsSize; ++i) 
{
        nums[i] = newArr[i];
    }
}

4.

解1:

/*
解题思路:将数组中要删除的元素用后面的元素覆盖掉
*/
int removeElement(int* nums, int numsSize, int val){
  int src = 0;
  int dst = 0;
​
  while(src < numsSize)
 {
    // 将数组中不等于val的值依次挪动到数组的开始位置
    if(nums[src] != val)
   {
      nums[dst] = nums[src];
      src++;
      dst++;
   }
    else
   {
      //如果是被删除的元素,直接++src位置,找到第一个不是val的位置
      src++;
   }
 }
​
  return dst;
}

解2:

int removeElement(int* nums, int numsSize, int val)
{
    int left = 0;
    for (int right = 0; right < numsSize; right++) 
    {
        if (nums[right] != val)
        {
            nums[left] = nums[right];
            left++;
        }
    }
    return left;
}

后记:
●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                                           ——By 作者:新晓·故知

猜你喜欢

转载自blog.csdn.net/m0_57859086/article/details/124048599