冲刺春招-精选笔面试 66 题大通关 day2

day2题目:14. 最长公共前缀3. 无重复字符的最长子串124. 二叉树中的最大路径和

学习计划链接:冲刺春招-精选笔面试 66 题大通关

今日知识点:字符串、滑动窗口、二叉树,难度仍为简单、中等、困难。

14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例 1:

输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”

示例 2:

输入:strs = [“dog”,“racecar”,“car”]
输出:""
解释:输入不存在公共前缀。

思路

这道题思路不用多说了吧()代码一看就懂

完整代码

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    let ans = "";
    let len = strs.length;
    for(let i = 0; strs[0][i]; ++i) {
        let ch = strs[0][i];
        if(!ch) return ans;
        for(let j = 1; j < len; ++j) {
            if(!strs[j][i] || strs[j][i] != ch) return ans;
        }    
        ans = ans+ch;
    }
    return ans
};

3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

思路

剑指offer的时候就做过,滑动窗口,进入窗口的字符若为重复(用hash存判断)的则将左侧窗口滑至该字符(并将hash中相应的key删除)同时记录长度,再继续滑动。

完整代码

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    let len = s.length;
    if(len == 0) return 0;
    let m = new Map();
    let [l, r] = [0, 0];
    let ans = 0;
    while(r < len) {
        while(m.has(s[r]))    // 出现过
            m.delete(s[l++]);   // 删除最左边的元素 直至出现过的元素消失
        m.set(s[r], r);
        ++r;
        ans = Math.max(ans, r-l);
    }
    return ans;
};

124. 二叉树中的最大路径和

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和

输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

思路

最大路径和,每个结点的最大路径和等于其左子节点最大路径和+root+右子节点最大路径和,考虑到有负值存在,则路径和有可能小于0,所以需取路径和与0中较大的那个。需要一个maxPath函数 返回左右路径中较大的那个路径和加上根节点值,并在沿途更新ans的最大值。

完整代码

/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxPathSum = function(root) {
    let ans = -Infinity;
    var maxPath = function(root) {
        if(!root) return 0;
        let [lp, rp] = [Math.max(maxPath(root.left), 0), Math.max(maxPath(root.right), 0)];
        ans = Math.max(ans, lp+rp+root.val);
        return Math.max(lp, rp) + root.val;
    }
    maxPath(root)
    return ans;
};

今天的题目码量倒是很少~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余cos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值