JS之LeetCode_01_02_20题分析记录

算法基础薄弱抓紧时间多补补

LeetCode 01 两数之和

如题:
在这里插入图片描述

分析

暴力破解肯定时间复杂度较大,而且面试官肯定不想看到这样的答案。
我们将目光从数组中拉出来,关注一下target = 9,我们可以利用9 减去 数组中的每个数得到和为target的另一个值,记为res。
假如nums = [ 2 ,7 ,11 ,15];
9 - nums[i] = 7 , 2 , -2 , -6; 那么 nums[i] = 2 7 11 15 ,这里我们可以借助Map集合来帮助我们找出两个数的下标。
将nums[i] 作为 Map的key 将 i 作为value,这样做的好处是可以通过map.has()方法检测是否存在和为target的另一个数,并且通过get()方法拿到下标。

代码

	  var twoSum = function(nums, target) {
	  let map = new Map();
		nums.forEach((num,i)=>{
			let res = target - num; // 7 2 -2 -6
			if(map.has(res)){
				return [map.get(num),i]; //得到2的下标 和当前的 i 值为1
			}else{
				/**
				* {
				* 	2 : 0,
				* 	7 : 1,
				* 	11 : 2,
				* 	15 : 3
				* }
				*/
				map.set(num,i); 
			}
		})
	}

LeetCode 02 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

思路:我们遍历两个链表,将两个链表的每一个节点值和一个进位next1值相加,即:val1 + val2 + next1next1是两个数相加后大于等于10进的1,不大于等于10 next1 = 0num = val1+val2+next1
num%10加入到新链表中,然后新链表往下加入新节点。

代码

	var addTwoNumbers = function(l1, l2) {
    let flist = new ListNode();
    let head = flist;
    let next1 = 0;
    while(l1 || l2){
       let val1 = l1? l1.val:0;
       let val2 = l2? l2.val:0;
       let sum = val1 + val2 + next1;
       next1 = sum>10? 1 : 0;
       flist.val = sum%10;
       flist.next = new ListNode();
       flist = flist.next;
       if(l1) l1 = l1.next;
       if(l2) l2 = l2.next;
    }
    if(next1 > 0){
        flist.next = new ListNode(next1);
    }
    return head;
};

LeetCode 20 有效的括号

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

分析

这道题应该比较简单,利用栈,我们可以将所有左括号加入栈中,然后遇到右括号就出栈,将出栈的字符与该右括号比较是否匹配。

var isValid = function(s) {
		    let stack = [];
		    let len = s.length;
		    if(len%2) return false;
		    for(let i = 0;i<len;i++){
		        switch(s[i]){
		            case "(":
		            case "{":
		            case "[":
		            stack.push(s[i])
		            break;
		            case ")":
		            console.log(stack.pop())
		             if(stack.pop() != "(") return false;
		            break;
		            case "}":
		              if(stack.pop() != "{") return false;
		            break;
		            case "]":
		              if(stack.pop() != "[") return false;
		            break;
		        }
		    }
		    return !stack.length;
		};

我看评论还有一种解法,这里也记录学习一下。

var isValid = function(s) {
		    let map = {
		        '{':'}',
		        '[':']',
		        '(':')'
		    }
		    let stack = [];
		    for(let c of s){
		        if(map[c])
		        {
		            stack.push(map[c]);
		        }
		        else{
		            if (stack.pop() !== c) return false;
		        }
		    }
		    return !stack.length
		};

每日三道题,加强算法学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值