专栏声明:只求用最简单的,容易理解的方法通过,不求优化,不喜勿喷
今天更新五个 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;
};