一,常数操作
例如:
int a = arr [i] ,加减乘除,位运算➡️是常数操作
int b = list.get(i) 不是常数操作,因为要在list里逐个遍历找直到i位置才能得到
常数操作:与数据量无关,是固定时间的操作
二,时间复杂度
在常数操作数量级的表达式中,只看最高阶的项且忽略其系数,写作O(看最高阶的项)
例子:
若两个算法时间复杂度一样,只能通过实验判断谁更优
三,额外空间复杂度
四,冒泡排序
五,选择排序
六,异或
异或无进位相加
性质:1.0异或N=N,N异或N=0;2.满足交换律,结合律;3.一批数与一个数异或,这一批数中谁先谁后与一个数异或都无所谓
交换两个数的值而不用另一个变量:
前提是a与b在内存中是不同的区域
真实的面试题:
有一个整数数组,问题1,一个数出现奇数次,其他数出现偶数次,问怎么找这一个数;问题2,两个数出现奇数次,其他数出现偶数次,如何找这两个数;要求时间复杂度为N,额外空间复杂度O(1)
做法:问题1,用一个变量设为0从头异或到尾,最后输出的变量即要找的数;
问题2,用一个变量从头异或到尾,输出为a异或b,另一个变量异或