算法基础薄弱抓紧时间多补补
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 + next1
,next1
是两个数相加后大于等于10进的1,不大于等于10 next1 = 0
,num = 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
};
每日三道题,加强算法学习