时间复杂度和空间复杂度概念及两数之和

201 阅读2分钟

复杂度:是一个模糊的概念,算法中复杂度使用大写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];
            }
          }
        }
};

F4218E4D-1AE1-4e36-B5A3-084FB249EAA6.png

方法二:时间复杂度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
       }
    }
};

2.png