「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」
有效括号
解法一
很经典的一道用栈解决的算法,简单说下思路,首先是要有一个栈,用来存放左括号,然后是要有一个哈希表,用来对应存放左括号对应的右括号。遍历字符串,如果是左括号就入栈,如果是右括号就看是否与栈顶的左括号匹配,匹配的话,左括号出栈。不匹配的话,直接返回false。最后根据栈是否为空栈返回true或者false,空栈即表示全部匹配成功返回true,否则就是左括号数量偏多,返回false。另外可以一开始判断字符串长度是否为偶数,不是的话直接返回false即可。因为字符串的长度为奇数,那么他肯定不可能完全匹配的。
var isValid = function(s) {
if (s.length % 2 === 1) {
return false;
}
let stack = []
let map = {
'(':')',
'{':'}',
'[':']'
}
for(let i= 0;i < s.length;i++){
if(map[s[i]]){
stack.push(s[i])
}else{
if(map[stack[stack.length-1]] === s[i]){
stack.pop()
}else{
return false
}
}
}
return stack.length === 0
};
二叉树层次遍历
解法一
广度优先算法
我们通过广度优先遍历来实现二叉树的层次遍历。广搜的写法是维护一个队列,然后将一层的节点加入队列中,然后弹出这一层的节点,加入保存该层的临时数组,并把数组加入到结果集中,并把他们的子节点加入对列中,之后依次遍历即可。
var levelOrder = function(root) {
if(root == null) return []
let queue = [root]
let res = []
while(queue.length){
let len = queue.length
let temp = []
for(let i = 0;i<len;i++){
let node = queue.shift()
temp.push(node.val)
if(node.left) queue.push(node.left)
if(node.right) queue.push(node.right)
}
res.push(temp)
}
return res
};
三数之和
解法一
排序加双指针
先将数组进行排序,遍历数组,如果数组当前值大于0,后面的值怎么加都不会等于0,跳出循环。如果当前值与上一值相同,进入下一次循环,防止重复。之后定义两个指针,一个左指针,初始是为i的后一位;一个是右指针,初始为数组的最后一位。然后移动指针,判断三个数相加是否等于0,等于0的话,将三个的值加入结果集中,此外,还需将左右指针,移动到,不连续为该值的地方。如果小于0,左指针的值小了,右移。如果大于0,右指针的值大了,左移。
var threeSum = function(nums) {
if(nums < 3) return []
let len = nums.length
nums.sort((a,b)=>a-b)
let res =[]
for (let i = 0; i < len; i++) {
if(nums[i] > 0) break
if(i > 0 && nums[i] === nums[i-1]){
continue
}
let L = i+1
let R = len
while(L < R){
let sum = nums[i] + nums[L] + nums[R]
if(sum === 0){
res.push([nums[i] , nums[L] , nums[R]])
while(L < R && nums[L] === nums[L+1]) L++
while(L < R && nums[R] === nums[R-1]) R--
L++
R--
}else if(sum < 0){
L++
}else{
R--
}
}
}
return res
};