本专栏是对自我的平时作业错题及掌握知识不牢固的地方的总结专栏.
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
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);
}