zoukankan      html  css  js  c++  java
  • leetcode算法题01

    最近求职需要重新刷算法题,从今天开始每天至少做一个leatcode的题
    如果有更好的算法或者换了语言也会更新

    • 题目:

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

    你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

    示例:

    给定 nums = [2, 7, 11, 15], target = 9

    因为 nums[0] + nums[1] = 2 + 7 = 9
    所以返回 [0, 1]

    • 解法 :

    官方给了三种解法:

    • 是暴力循环,想的简单,易于理解,但是如果数组里元素很多的话就很卡,复杂度分析:
      时间复杂度:O(n^2) ), 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n) 的时间。因此时间复杂度为 O(n^2)。
      空间复杂度:O(1)。

    • 是用哈希表循环两遍,第一遍是录入哈希表,第二遍再循环找一遍,
      复杂度分析:

      时间复杂度:O(n), 我们把包含有 nn 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1),所以时间复杂度为 O(n)。

      空间复杂度:O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 n个元素。

    • 是用哈希表循环一遍,在第一遍时一边录入一边排查,之前面试也碰到过这道题,当时面试官给的解法就是这种,相对理想
      复杂度分析
      时间复杂度:O(n), 我们只遍历了包含有 nn 个元素的列表一次。在表中进行的每次查找只花费 O(1) 的时间。
      空间复杂度:O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储 n 个元素。

    • 代码

    var twoSum = function(nums, target) {
        var result=[];
        var test=new hashTable();
        // var i=0;
       nums.forEach(function(item,index){
               
          // console.log("success" +index);
           if(test.containsKey(target-item)&&item==(target-item)){
                result.push(test.getValue(target-item),index);
             test.remove(target-item);
             //  console.log("same");
           }     
          else {
                test.add(item,index);
                 if(test.containsKey(target-item)&&index!==test.getValue(target-item)){
                        // result.push([test[item],test[target-item]]);
                         result.push(test.getValue(target-item),test.getValue(item));
                        test.remove(item);
                        test.remove(target-item);
                   //    console.log("delete");
                    }
                        }
           });
        return result;       
    };
    
    • 心得

    题不难,主要是练习通过哈希表的排序是怎么用js实现的,哈希表的搜索简单快捷,实现起来也不难。之前没用js做过。
    在调试的过程中出现了2回问题

    • 刚开始我只是想把数组的值作为key,序号作为value,没有考虑当两个值都是一样的时候哈希表会覆盖,报了一回错,加了个if判断了一下,就解决了

    • 数据范围考虑不全。没有考虑给的和等于他本身时的情况,报了一回错,加了个if判断了一下,就解决了。

    • 更新

    • 未来想用python实现一下,算法方面应该没什么可优化的了。

  • 相关阅读:
    FZU 2112 并查集、欧拉通路
    HDU 5686 斐波那契数列、Java求大数
    Codeforces 675C Money Transfers 思维题
    HDU 5687 字典树插入查找删除
    HDU 1532 最大流模板题
    HDU 5384 字典树、AC自动机
    山科第三届校赛总结
    HDU 2222 AC自动机模板题
    HDU 3911 线段树区间合并、异或取反操作
    CodeForces 615B Longtail Hedgehog
  • 原文地址:https://www.cnblogs.com/dadaochangcun/p/9806574.html
Copyright © 2011-2022 走看看