leetcode_01_two sum

最近诸事不顺,归根结底的原因主要是自己太菜了,顾开始刷题,总是能够看到一些大佬骨骼清奇的解题思路,并且傲居解题榜 faster than 100%的榜单,刷题为次要,领会学习方法才是正经,顾写一些自己的领悟。
在这里插入图片描述
two sum解题
答案:

var twoSum = function(nums, target){
  if ( !Array.isArray(nums) || Object.prototype.toString.call(target) !== "[object Number]" ) 
  return;

  var arr = [],
      i,
      j,
      len = nums.length;

  for ( i = 0; i < len; i ++ ){
    j = arr[ target - nums[i] ];
    if ( j !== undefined  ) return [ j, i ];
    arr[nums[i]] = i;
  }
}

深思之后,大佬的思路是
将nums的(key, value)反转成为 (value, key)存入新的空数组 arr中
比如题目中给出的nums例子 [2, 7, 11, 15]
对应渲染出来arr的数组应该是:
[empty, empty, 0, empty, empty, empty, empty, 1, empty, empty, empty, 2, empty, empty, empty, 3]
在这里插入图片描述
在进行遍历的的时候, j就是对应arr数组里面的 value值,只要j !== undefined, 就说明已经出现了能够使的和为target的值了。
当然这种方法也是比较坑的,

  1. 依靠给出的nums数组的元素保持效率,只要查询到合适的结果就会返回, 比如nums = [1,2,3,4,5,6,7] ,结果就只会返回 [3, 4] 不会返回 [1, 6];
  2. 还有我本来猜想如果题目组故意给出了一个nums = [100, 500, 60, 1, 8]的数组,岂不是arr会成为一个 length = 499长度的数组,看上去对存储空间的占用不是特别友好。

其实应该是
[undefined, undefined, 0, undefined, undefined, undefined, undefined, 1, undefined, undefined, undefined, 2, undefined, undefined, undefined, 3]
谷歌浏览器打出来是empty, undefined会占用固定内存无论是在栈区还是堆区,至于empty,还请路过大佬帮忙看一下了

还看到了一种对我来说比较合理的思路,就不是存数组了

var twoSum = function(nums, target) {
    var map = {};
    var len = nums.length;
  
    for (var i=0; i<len; i++){
      
        var el = nums[i];
        var diff = target - el;
        
        if((map[diff] !== undefined) && (i !== map[diff].position)){
            var posX = map[diff].position;
            if(i > posX){
                return [posX, i]
            } else {
                return [i, posX];
            }
        }
      
        map[el] = {value: diff, position: i};
      
    }
};

这段代码中,有两个地方对我来说是存在疑问的:

  1. map中的value属性,在我看来是没必要存的,用不到还占地方,我删除了value属性之后明显memory的百分比大了一些。
  2. 对于if(i > posX)的判断是否有必要,我删除判断之后,也还是 accpeted的答案,但是明显不那么快了,我的想法是不应该留下判断语句才是会拖慢速度么,而且for循环本来就是从0到1渲染的,为什么会出现 i 小于 posX的区别呢

看来只有想明白这些问题, 才能真正的跟上大佬的步伐。

而且最主要的问题是,关于内存占用的问题,前面的数组解法占用内存比对象的这种少很多,如果说会出现我的这种arr.length == 499的这种极端情况,那数组的内存占用应该是比对象大很多才对吧

疑问提了这么多,希望能得到大佬的回答。
(日常菜哭)

猜你喜欢

转载自blog.csdn.net/qq_34567015/article/details/89288144