时间复杂度:
例题:找到两个有序数组(链表)的公共部分。数组1的长度为n,数组2的长度为m。
方法1:遍历数组1,每个数都去数组2中遍历,时间复杂度为O(nm);
方法2:由于两个数组有序,所以遍历数组1,去数组2中二分法查找,时间复杂度为O(nlogm)。
(二分法的时间复杂度为logn)
方法3:准备两个指针,分别指向两个数组的头部,比较两个指针所指元素的大小,谁小谁向前走,遇到相等就打印,然后两个指针共同向后移动一位,直到其中一个指针走到null。时间复杂度为O(n+m).
方法1的复杂度最高,但是方法2和方法3的优劣需要具体考虑数据量的情况。比如n=4,m=232,此时方法2的复杂度优于方法3.
空间复杂度:
空间复杂度一般指的是额外空间复杂度。输入和输出不占空间,额外空间指的是为了实现该功能所需要的辅助空间
例题:将数组12345 67调整为67 12345,也就是将数组分为两部分,实现一个功能使两不部分交换位置。
方法1:
额外准备一个数组,数组长度为原数组的长度,先把后半部分放入辅助数组中,再将前半部分放入辅助数组中,然后将辅助数组复制进原数组输出。
该方法需要准备一个辅助数组,因此空间复杂度为O(n)
方法2:
先将前半部分逆序,再将后半部分逆序,然后将整体逆序。逆序的方法是准备两个指针分别指向头跟尾,然后互相交换,然后指针分别向中间移动,直到碰到一起或者错过。
由于该方法不需要额外空间,只在原数组上进行操作,因此空间复杂度为O(1).
最优解:先满足时间复杂度最低的情况下,满足空间复杂度最低。