数据结构---作业1时间复杂度

本专栏是对自我的平时作业错题及掌握知识不牢固的地方的总结专栏.

1.大O是一个渐进表示法,不会去表示精确的次数,cpu的运算速度很快,估计精确的没有意义。
2.
在这里插入图片描述
此函数有一个循环,但是循环没有被执行n次,i每次都是2倍进行递增,所以循环只会被执行log2(n)次。
3.
在这里插入图片描述
此函数会被递归调用n - 1次,每次操作都是一次,所以时间复杂度为n
4.

在这里插入图片描述
此题目中,数组元素有序,所以a,b两个数可以分别从开始和结尾处开始搜,根据首尾元素的和是否大于sum,决定搜索的移动,整个数组被搜索一遍,就可以得到结果,所以最好时间复杂度为n
5.
在这里插入图片描述
T(n)

=T(n-1)+n

=T(n-2)+(n-1)+n

=T(n-3)+(n-2)+(n-1)+n

=T(0)+1+2+…+(n-2)+(n-1)+n

=1+1+2+…+(n-2)+(n-1)+n

从递推公式中可以看到,第n项的值需要从n-1开始递归,一直递归到0次结束,共递归了n-1次

所以时间复杂度为n

扫描二维码关注公众号,回复: 14972402 查看本文章

6.
在这里插入图片描述
在这里插入图片描述
使用三次逆转法
第一次:整个数组的元素逆转一遍
第二次:逆转子数组
第三次:逆转另一个子数组

(1)标准答案:注意begin,end都是逆转的数组的下标


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)我的答案:begin,end都表示的是指针

void reverse(int* begin, int* end ) {
	while (begin < end) {
		int temp = *begin;
		*begin = *end;
		*end = temp;
		begin++;
		end--;
	}

}
void rotate(int* arr,int sz, int k) {
	k = k % sz;

	reverse(arr, arr + sz - 1);
	reverse(arr, arr + k - 1);
	reverse(arr + k, arr + sz - 1);
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_66238381/article/details/130171606