复杂度:是一个模糊的概念,算法中复杂度使用大写O表示,O代表算法量级概念。在一道算法题中,可以从时间复杂度(执行用时)和空间复杂度(内存消耗)两个维度来考量这道算法题。
时间复杂度: 意味着耗时多少(执行用时), 用O表示。
例如:O(n^2)指,n代表数组长度,执行时间是n^2,如果n为100,执行时间是100^2。通常情况下,说复杂度的时候不会考虑n前后的常量。注意: 对象查询的时间复杂度是O(1),不占用时间复杂度的
空间复杂度: 指运行算法时,需要多少额外的空间,(即内存消耗)。
普通数字的空间复杂度,例如i,k,是占用指定的内存空间,100和10000的空间复杂度是一样的,不会随数字的变化而改变。而数组的空间复杂度,是随数组内容增加而增加的。例如:普通数字的空间复杂度是O(1),O(1)是非常牛逼的;循环存储指定对象属性的空间复杂度是O(n),n代表数组长度。
LeetCode算法第一题:两数之和
方法一:时间复杂度O(n^2) 空间复杂度O(1)
var twoSum = function(nums, target) {
for (let i = 0; i < nums.length; i++) {
for (let k = 0; k < nums.length; k++) {
if (nums[i] + nums[k] == target && i !== k) {
return [i,k];
}
}
}
};
方法二:时间复杂度On 空间复杂度O(n)
/*
数组的长度是n
对象查询的时间复杂度是O(1),不占用时间复杂度的
*/
var twoSum = function(nums, target) {
let obj = {}
for(let i = 0;i<nums.length;i++){
let num = nums[i]
let n = target - num
if(n in obj){
return [obj[n],i]
}else {
obj[num] = i
}
}
};