算法杂记(五)

130 阅读1分钟

「这是我参与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
};