第一天刚开始就学两数之和先尝试用暴力破解,发现一旦提交代码就会报错,计算超时了
/** * @param {number[]} nums * @param {number} target * @return {number[]} */var twoSum = function(nums, target) { for(let i=0;i<nums.length;i++){ for(let j=0;i<nums.length;j++){ if(nums[i]+nums[j]===target&&i!==j){ return [i,j] } } }};
那么就要想办法去解决这个问题,首先就要考虑复杂度问题
复杂度其实是一个模糊的感念,复杂度用O表示,首先第一种情况数据长度是N 算法大概执行了多少次,上面的算法时间复杂度是O(n^2).空间复杂度指的是正在运行这个算法的时候需要多少额外的空间,以上代码只用到了i和j,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 // 上面的n是我们需要的,当2来的时候我们就知道需要7 当7来的时候就知道需要2,然后就是检查是否存在到当前对象 // 然后返回下标和对象中存在的下标 if(num in obj){ return [i,obj[num]] }else{ obj[n]=i } }};