理解
原理:如何将一个问题,可以将规模为n的问题,通过O(1)的时间,变成规模为n/2的问题。
表达式:T(n)= T(n / 2) + O(1) = O(logn)。,当输入规模n = 8时,x = 3,代表8除3次2等于1。
问题:如何得到O(logn)?
解答:T(n)= T(n / 2) + O(1)= T(n / 4) + O(1)+ O(1)= T(n / 8) + O(1)+ O(1)+ O(1)= ...经过logn次后... = O(logn)
如果 T(n)= T(n / 2) + O(n) = ?
解答:T(n)= T(n / 2) + O(n)= T(n / 4) + O(n / 2)+ O(n)= T(n / 8) + O(n / 4)+ O( n / 2)+ O(n)= O(1) + ... + O(n / 4)+ O( n / 2)+ O(n) = O(1+..+ n / 8 + n / 4 + n / 2 + n)= 通过等比公式 , 计算可得 = O(2n) = O(n)
有关时间复杂度的题型
二分法常见痛点
通用的二分法模板
1.循环的结束条件是 start + 1 < end ,并且永远是start + 1 < end
2.不纠结到底哪一个是target,在循环结束后再来判断start和end索引位哪一个是要的target
int binarySearch(int[] nums,int target)
{
if(nums == NULL || nums.length == 0)
{
return -1;
}
int start = 0, end = nums.length - 1;
//相邻就退出循环
//start = 1,end = 2就要退出
while(start + 1 < end)
{
//int mid = (start + end) / 2;对于start,end ~ 2^31,不会下标越界
int mid = (end - start) / 2 + start;
if(target == nums[mid]) end
{
end = mid;
}
else if(target <nums[mid])
{
end = mid;
}
else
{
start = mid;
}
}
//double check
if(nums[start] == target)
{
return start;
}
if(nums[end] == target)
{
return end;
}
return -1;
}