leetcode 5月 每日一题(持续更新

5.1 Merge Two Sorted Lists

题目:21. Merge Two Sorted Lists 合并两个有序链表

var mergeTwoLists = function(l1, l2) {
    var ans = new ListNode(-1), cur = ans;
    while(l1 && l2){
        if(l1.val <= l2.val){
             cur.next = l1; l1 = l1.next;
        }else{
            cur.next = l2; l2 = l2.next;
        }
        cur = cur.next;
    }
    cur.next = l1?l1:l2;
    return ans.next;
};

5.2 Maximum Subarray

题目:53. Maximum Subarray 最大子序和

方法一:动态规划

var maxSubArray = function(nums) {
    var ans  = nums[0], _dp = [nums[0]], temp;
    for(var i = 1; i < nums.length; i++){
        temp = nums[i] + _dp[i-1];
        _dp.push(Math.max(temp,nums[i]));
        ans = Math.max(ans,_dp[i]);
    }
    return ans;
};
var maxSubArray = function(nums) {
    var ans  = nums[0];
    for(var i = 1; i < nums.length;i++){
        nums[i-1]>0 && (nums[i]+=nums[i-1]);
        ans = Math.max(ans,nums[i]);
    }
    return ans;
};

5.4 Jump Game II

题目:45. Jump Game II
方法一:贪心,反向查找出发位置

var jump = function(nums) {
    var cur = nums.length-1;
    var res = 0 ,t;
    while(cur!=0){
        for(var i=0,t=0;i<cur;i++){
            if(i+nums[i] >= cur){t=i;break;}
        }
        cur = t; res++;
    }
    return res;
};

在这里插入图片描述
方法二:正向遍历

var jump = function(nums) {
     if(nums.length==1) return 0;
    var cur = 0, res = 0, t;
   while(cur+nums[cur]<nums.length-1){
       for(var i=1,t=1;i<=nums[cur];i++){
           if(i+nums[cur+i] > t + nums[cur+t]){
                t=i;
           }
       }
       cur += t;res++;
   }
    return res+1;
};

在这里插入图片描述

5.5 Validate Binary Search Tree

题目:98. Validate Binary Search Tree 验证二叉搜索树
用中序遍历
在这里插入图片描述

var isValidBST = function(root) {
    var pre = -Infinity;
    var func = function(root){
        if(root==null) return true;
        if(!func(root.left)) return false;
        if(root.val <= pre) return false;
        pre = root.val;
        if(!func(root.right)) return false;
        return true;
    }
    return func(root);
};

在这里插入图片描述

5.6 Minimum Cost For Tickets

题目:983. Minimum Cost For Tickets 最低票价
动态规划

var mincostTickets = function(days, costs) {
     var dp = [0],len = days.length-1;
     for(var i = 1; i <= days[len]; i++){
         if(!days.includes(i)){
             dp[i] = dp[i-1];
         }else{
             dp[i] = Math.min(
                dp[Math.max(0,i-1)]+costs[0],
                dp[Math.max(0,i-7)]+costs[1],
                dp[Math.max(0,i-30)]+costs[2]);
         }
     }
    return dp[dp.length-1];
};

在这里插入图片描述

5.7 Subtree of Another Tree

题目:572. Subtree of Another Tree 另一个树的子树

转成json字符串再判断是不是子字符串…

var isSubtree = function(s, t) {
    return (JSON.stringify(s).indexOf(JSON.stringify(t)))>-1;
};

在这里插入图片描述

常规做法:先序遍历,判断子串(这里判断的方式使用indexOf感觉不太正经… 懒得写KMP)

var isSubtree = function(s, t) {
    var sOrder = [], tOrder= [];
    var getPreorder = function(t,order){
        order.push("v"+t.val);
        if(t.left){ getPreorder(t.left,order);
        }else{ order.push('l'); }
        if(t.right){ getPreorder(t.right,order);
        }else{ order.push('r'); }
    }
    getPreorder(s,sOrder);
    getPreorder(t,tOrder);
    sOrder = sOrder.join();
    tOrder = tOrder.join();
    return sOrder.indexOf(tOrder)>-1;
};

在这里插入图片描述

5.8 Maximal Square

题目:221. Maximal Square 最大正方形

动态规划:
在这里插入图片描述

var maximalSquare = function(matrix) {
    var res = 0;
    for(var i=0;i<matrix.length;i++){
        for(var j=0;j<matrix[0].length;j++){
            if(i>0 && j>0 && matrix[i][j]==1){
                matrix[i][j] = Math.min(
                    matrix[i-1][j-1],matrix[i-1][j],
                    matrix[i][j-1]) +1;
            }
            res = Math.max(res,matrix[i][j]);
        }
    }
    return res * res;
};

在这里插入图片描述

5.9 69. Sqrt(x)

题目: 69. Sqrt(x)
二分查找

var mySqrt = function(x) {
    var l = 0, r = x,m,ans=-1;
    while(l<=r){
        m = parseInt((l+r)/2);
        if(m*m <= x){
            ans = m; l = m+1;
        }else{
            r = m-1;
        }
    }
    return ans;
};

在这里插入图片描述

5.10 Sqrt(x)

题目:69. Sqrt(x)

二分

var mySqrt = function(x) {
    var l = 0, r = x,m,ans=-1;
    while(l<=r){
        m = parseInt((l+r)/2);
        if(m*m <= x){
            ans = m; l = m+1;
        }else{
            r = m-1;
        }
    }
    return ans;
};

5.11 Pow(x, n)

题目:50. Pow(x, n)
快速幂
在这里插入图片描述

var myPow = function(x, n) {
    var func = function(x,n){
        if(n==0) return 1.0;
        var y  = func(x,parseInt(n/2));
        return n%2?y*y*x:y*y;
    }
    var res = func(x,n);
    return n<0?1/res:res;
};

5.12 Min Stack

题目:155. Min Stack 最小栈
用一个额外的栈来记录
在这里插入图片描述

var MinStack = function() {
    this.st = [];
    this.minst =[];
};
MinStack.prototype.push = function(x) {
    this.st.push(x);
    if(this.minst.length!=0)
        this.minst.push(Math.min(x,this.minst[this.minst.length-1]));
    else this.minst.push(x);
};
MinStack.prototype.pop = function() {
    this.st.pop();
    return this.minst.pop();
};
MinStack.prototype.top = function() {
    return this.st[this.st.length-1];
};
MinStack.prototype.getMin = function() {
    return this.minst[this.minst.length-1];
};

5.13 Binary Tree Level Order Traversal

题目:102. Binary Tree Level Order Traversal 二叉树的层序遍历

广度优先搜索

var levelOrder = function(root) {
    if(root == null) return [];
    var res = [],st = [root,null];
    while(st.length>1){
        var t = [];
        while(true){
            var node = st.shift();
            if(node == null) break;
            t.push(node.val);
            node.left && (st.push(node.left));
            node.right && (st.push(node.right));
        }
        res.push(t);
        st.push(null);
    }
    return res;
};

5.14 Single Number

题目:136. Single Number
找唯一没有重复出现的数,用异或

var singleNumber = function(nums) {
    var res = 0;
    for(var i = 0; i < nums.length; i++){
        res ^= nums[i];
    }
    return res;
};

5.17 Course Schedule II

题目:210. Course Schedule II 课程表 II

拓扑排序:找入度为0的点

var findOrder = function(numCourses, prerequisites) {
    var tp = new Array(numCourses).fill(0), res = [];
    for(let i = 0; i < prerequisites.length; i++){
        tp[prerequisites[i][0]] ++;
    }
    while(true){
        let t = -1;
        for(let i = 0; i < numCourses; i++){
            if(tp[i] == 0){ t = i; break;}
        }
        if(t != -1){ 
        	res.push(t); tp[t] = -1;
        }else{
            break;
        }
        for(let i = 0; i < prerequisites.length; i++){
            if(prerequisites[i][1] == t){ tp[prerequisites[i][0]]--; }
        }
    }
    return res.length == numCourses ? res:[];
};

5.18 Maximum Product Subarray

题目:152. Maximum Product Subarray 乘积最大子数组

动态规划

var maxProduct = function(nums) {
    var dp = [nums[0]], ln = nums[0]<0?0:-1, res = nums[0];
    for(var i=1;i<nums.length;i++){
        dp[i] = nums[i];
        if(nums[i]>0 && dp[i-1]>0){
            dp[i] *= dp[i-1];
        }else if(nums[i] <0){
            if(ln>=0){
                for(var j=ln;j<i;j++){
                    dp[i] *= nums[j];
                }
                if(ln>0 && dp[ln-1]>1) dp[i] *= dp[ln-1];
            }
            ln = i;
        }
        res = Math.max(res,dp[i]);
    }
    return res;
};

在这里插入图片描述

5.19 Valid Palindrome II

题目:680. Valid Palindrome II 验证回文字符串 Ⅱ

在允许最多删除一个字符的情况下,同样可以使用双指针,通过贪心算法实现。初始化两个指针 low 和 high 分别指向字符串的第一个字符和最后一个字符。每次判断两个指针指向的字符是否相同,如果相同,则更新指针,令 low = low + 1 和 high = high - 1,然后判断更新后的指针范围内的子串是否是回文字符串


var validPalindrome = function(s) {
    var func = function(t){
        var l=0,r = s.length-1, flag = true;
        while(l<r){
            if(s[l]==s[r]){
                l++; r--;
            }else{
                if(flag){
                    flag = false; t?l++:r--;
                }else{
                    return false;
                }
            }
        }
        return true;
    }
    return func(true) ||func(false);
};

在这里插入图片描述

5.21 Longest Palindromic Substring

题目:5. Longest Palindromic Substring 最长回文子串 链接

中心扩张,一共有两种情况
bab,中心点是a;
bb,中心点是两个b之间
两种组合取最大回文串的长度(两个指针,往左右移动,找出嘴长回文的长度)
在这里插入图片描述
在这里插入图片描述

var longestPalindrome = function(s) {
    var ans = 1,start=0;
    if(s==null || s.length < 2) return s;
    var getLongestPalindrome = function(l,r){
        let i=0,temp;
        while(l-i>=0 && r+i<s.length && s[l-i]==s[r+i]){
        	temp=(r-l+1)+2*i;
            if(ans<temp){ans=temp;start = l-i;};
            i++;
        }
    }
    for(let ii = 0;ii<s.length;ii++){
        getLongestPalindrome(ii,ii);
        getLongestPalindrome(ii,ii+1);
    }
    return s.substring(start,ans+start);
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值