5月22日 每日leetcode三题(9/5/124)

前言

昨天跟今天都没有新题目,刷一下5月19日的老题目(打了一天半数模,比较晚刷),9.回文数、5.最长回文子串、124.二叉树中的最大路径和。

9.回文数(容易):
题目描述:

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number

题解:

这道题写过好多次,也记得好多好玩的解法。
需要注意的是,负数必不是回文数,可以直接返回false,其他情况正常判断。
常规解法是取出一半的数字(低n/2位或者低n/2+1位),通过模10就可以得到。

Code
// 短代码解法
var isPalindrome = function(x) {
    if(x<0) return false;
    return x==String(x).split("").reverse().join("");
};

// 常规解法(100%,98%)
var isPalindrome = function(x) {
    if(x<0||x%10==0&&x!=0) return false;
    let revertedNumber=0;
    while(x>revertedNumber){
        revertedNumber=revertedNumber*10+x%10;
        x=Math.floor(x/10);
    }
    return x==revertedNumber||x==Math.floor(revertedNumber/10);
};
5.最长回文子串(中等):
题目描述:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring

题解:

本题的常规解法是动态规划(记录所有的可能,并从中找到最长的一个回文子串)。还有一种中心扩展算法,基于不同的回文中心,通过状态转移方程进行扩展。

Code
// 中心扩展算法:时间复杂度:O(n²),空间复杂度O(1)
var longestPalindrome = function(s) {
    if(!s||s.length<2) return s;
    let start=0;
    let end=0;
    for(let i=0;i<s.length;i++){
        let l1=expandCenter(s,i,i);
        let l2=expandCenter(s,i,i+1);        
        let len=Math.max(l1,l2);
        if(len>end-start){
            start=i-Math.floor((len-1)/2);
            end=i+Math.floor(len/2);
        }
    }
    return s.substring(start,end+1);
};
const expandCenter = function(s,l,r) {
    while(l>=0 && r < s.length && s[l] === s[r]) {
        l--;
        r++;
    }
    return r - l - 1;
}
124.二叉树中的最大路径和(困难):
题目描述:

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum

题解:

在某个节点上去寻找最大路径和,有两种选择,一种是继续向下寻找,另一种是以当前结点为路径中的其中一点去做联络,因此要在这时做出决策,而这两种选择哪种更优,则通过递归至空结点来得到计算值。

Code
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxPathSum = function(root) {
    let max_sum=-Infinity;
    function max_gain(node){
        if(!node) return 0;
        let left_gain=Math.max(max_gain(node.left),0);
        let right_gain=Math.max(max_gain(node.right),0);
        let price_newpath=node.val+left_gain+right_gain;
        max_sum=Math.max(max_sum,price_newpath);
        return node.val+Math.max(left_gain,right_gain);
    }
    max_gain(root);
    return max_sum;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值