目录
1.如果一个函数的栈空间中只定义了一个二维数组a[3][6],请问这个函数的空间复杂度为( )
4.原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。OJ链接
后记:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!
题目:
【单选题】
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; }