[失业前端恶补算法]JavaScript leetcode刷题top100(二):对称二叉树、二叉树的最大深度、买卖过票的最佳时机、只出现一次的数字、环形链表

专栏声明:只求用最简单的,容易理解的方法通过,不求优化,不喜勿喷
今天更新五个 easy 难度题目:

对称二叉树

  • 题面
    给你一个二叉树的根节点 root , 检查它是否轴对称。
  • 知识点:
    二叉树
  • 思路
    自顶向下遍历二叉树,每次传入两个对称位置的节点,如果不同则返回不对称,如果相同,那么遍历左侧节点的左孩子和右侧节点的右孩子,再遍历左侧节点的右孩子和右侧节点的左孩子,直到遍历到的节点都是 null
  • 代码
var isSymmetric = function (root) {
    
    
    let f = true;
    let dfs = function (node, node2) {
    
    
        if (node == null && node2 == null) {
    
    
            return;
        }
        if (node == null || node2 == null || node.val !== node2.val) {
    
    
            f = false;
            return;
        }
        dfs(node.left, node2.right);
        dfs(node.right, node2.left);
        return;
    }
    dfs(root.left, root.right);
    return f;
};

二叉树的最大深度

  • 题面
    给定一个二叉树,找出其最大深度。
    二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
  • 知识点
    二叉树、深度优先搜索
  • 思路
    自顶向下遍历二叉树,携带当前高度,遍历孩子节点时高度+1,如果当前高度大于最高高度,更新最高高度。
  • 代码
var maxDepth = function (root) {
    
    
    let max = 0;
    let dfs = (root, h) => {
    
    
        if(!root){
    
    
            return ;
        }
        if (h > max) {
    
    
            max = h;
        }
        if (root.left) {
    
    
            dfs(root.left, h + 1)
        }
        if (root.right) {
    
    
            dfs(root.right, h + 1)
        }
    }
    dfs(root, 1)
    return max;
};

买卖股票的最佳时机

  • 题面
    给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
    你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
  • 知识点
    动态规划
  • 思路
    DP思想,对于每一位,将它更新为到目前位置的股票价格的最小值。顺序遍历整个数组,每次先计算当前的价格减去之前的最小值是不是比最大收益大,如果是则更新最大收益,之后更新当前位为前n位股票价格的最小值。
  • 代码
var maxProfit = function (prices) {
    
    
    let max = 0;
    for (var i = 1; i < prices.length; i++) {
    
     
        if (prices[i] - prices[i - 1] > max) {
    
    
            max = prices[i] - prices[i - 1];
        }
        prices[i] = Math.min(prices[i - 1], prices[i]);
    }
    return max;
};

只出现一次的数字

  • 题面
    给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
    你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
  • 知识点
    数学
  • 思路
    已知一个数和它本身异或得到是 0 ,所以我们将整个数组的所有数据亦或,得到的就是我们需要的数字
  • 代码
var singleNumber = function (nums) {
    
    

    let a = 0;
    for (var i = 0; i < nums.length; i++) {
    
    
        a = a ^ nums[i];
    }
    return a;

};

环形链表

  • 题面
    给你一个链表的头节点 head ,判断链表中是否有环。
    如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
    如果链表中存在环 ,则返回 true 。 否则,返回 false 。

  • 知识点
    链表

  • 思路
    定义两个指针,一个一次走一步,一个一次走两步,如果快指针到达链表底部,那么链表没有环,否则这两个指针最终会相遇在某一个节点

  • 代码

var hasCycle = function (head) {
    
    
    let a = head;
    let b = head;
    while (a) {
    
    
        a = a.next;
        if (a) {
    
    
            a = a.next;
        }else{
    
    
            return false;
        }
        b = b.next;
        if(a == b){
    
    
            return  true;
        }
    }
    return false;
};

猜你喜欢

转载自blog.csdn.net/weixin_46463785/article/details/129274178