LeekCode解题记录

Posted eyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeekCode解题记录相关的知识,希望对你有一定的参考价值。

感觉自从上次用简单算法解了两道小学生题后,感觉就停不下来了。然后就开始在网上找类似的题目,再然后就发现了LeekCode这个网站,专业的算法解题网站,提供题目并且支持在线编辑代码(支持js),之后会通过大量的测试用例来检测你的代码执行结果,并会记录每一次的提交记录。最重要的是,有一个题解模块(玩家交流模块)可以看到别人的解法(玩家自主发言,你也可以发布你自己的解法,当然这之中也有官方发布的题解)。 对于我来说,感觉简直就是来到了天堂一般。虽然我是做前端的,但是我依然对算法充满了兴趣(不太能理解有一些同做前端的同事或朋友并不关心算法的想法,当然他们也不太能理解我的想法)。

我现在兴趣正浓,不过也不知道自己能坚持多久。但是我觉得必要的记录和回顾还是必不可少的。我现在的打算是每天至少完成一个算法,先由浅入深,从简单的算法开始吧,培养思维,再继续深入。

LeekCode--1.两数之和
给定一个整数数组 nums?和一个目标值 target,请你在该数组中找出和为目标值的那?两个?整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

解题思路:第一题很简单(果然网站对于新人还是很友善的)。使用两层for循环依次叠加比较便可实现。

var twoSum = function(nums, target) 
    for(let i=0;i<nums.length;i++)
        for(let j=nums.length-1;j>i;j--)
            if(target===nums[i]+nums[j])
                return [i,j];
            
        
    
;

然后去看了一下别人的解法,发现自己很low,别人都是用map解的,少了一层遍历,会节省时间,用了map会占用更多空间,典型的用空间换取时间的解法。基本思路:边比较边存值。利用map的特殊性,将数组的值作为map的键,值对应的索引作为map的值。遍历数组,用target与每一项值作差,看是否存在于map中,如存在则返回map中存的索引和当前循环变量,如不存在则将当前值及其索引存入map中。

var twoSum = function(nums, target) 
    let m=new Map();
    for(let i=0;i<nums.length;i++)
        if(m.get(target-nums[i])||m.get(target-nums[i])===0)
            return [m.get(target-nums[i]),i];
        else
            m.set(nums[i],i);
        
    
;

LeekCode--118.杨辉三角
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
技术图片
在杨辉三角中,每个数是它左上方和右上方的数的和。

解题思路:杨辉三角应该是所有程序员都实现过的算法之一吧,依旧是两层for循环可以实现,外层循环实现层数,每层的第一个和最后一个数字固定为1,其他数字为上一层对应位置和前一位置值的和。

var generate = function(numRows) 
    let list=[];
    for(let i=1;i<=numRows;i++)
        let listA=[];
        listA[0]=listA[i-1]=1;
        for(let j=1;j<i-1;j++)
            listA[j]=list[i-2][j-1]+list[i-2][j];
        
        list.push(listA);
    
    return list;
;

今天写了两个最简单的,明天继续。

以上是关于LeekCode解题记录的主要内容,如果未能解决你的问题,请参考以下文章

算法进阶之Leetcode刷题记录

Leetcode解题记录

Pwnable中的passcode解题记录:

pwnable.kr input解题记录

152. Maximum Product Subarray 解题记录

71. Simplify Path 解题记录