「每日LeetCode」2020年9月13日

本文最后更新于:2023年3月19日 晚上

Lt257.二叉树的所有路径、Lt283.移动零、Lt392.判断子序列

257.二叉树的所有路径

Category Difficulty Likes Dislikes
algorithms Easy (66.05%) 363 -

Tags
tree | depth-first-search
Companies
apple | facebook | google
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:

1
2
3
4
5
6
7
8
输入:
1
/ \
2 3
\
5
输出: ["1->2->5", "1->3"]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3

Discussion | Solution

思路

和之前求是否存在一条路径的和和目标值相同类似,都是深度优先遍历所有根到节点的路径。树的题思路都是用最小规模来看。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
* @lc app=leetcode.cn id=257 lang=javascript
*
* [257] 二叉树的所有路径
*/

// @lc code=start
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {string[]}
*/
var binaryTreePaths = function (root) {
const res = [];
let tmp = [];
visit(root, res, tmp);
return res;
};

const visit = (root, res, tmp) => {
if (!root) return;
tmp.push(root.val);
if (root && !root.left && !root.right) {
res.push(tmp.join("->"));
}
if (root.left) visit(root.left, res, tmp);
if (root.right) visit(root.right, res, tmp);
tmp.pop();
};
// @lc code=end
1
2
3
4
Accepted
209/209 cases passed (88 ms)
Your runtime beats 61.62 % of javascript submissions
Your memory usage beats 64.82 % of javascript submissions (39.6 MB)

283.移动零

Category Difficulty Likes Dislikes
algorithms Easy (62.28%) 731 -

Tags
array | two-pointers
Companies
bloomberg | facebook
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:

1
2
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

Discussion | Solution

思路

是 0 则删除放到最后,没有难度,但应该有更好的解法。

双指针

遍历数组,如果 i 指向的不为 0,则将 nums[k]设为 i 指向的值,k++。遍历完后,前面都为有数值的值,将剩下的都设为 0 即可。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
* @lc app=leetcode.cn id=283 lang=javascript
*
* [283] 移动零
*/

// @lc code=start
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function (nums) {
for (let i = 0; i < nums.length; i++) {
if (nums[i] === 0) {
nums.push(nums.splice(i, 1));
i--;
}
}
};
// @lc code=end
1
2
3
4
Accepted
21/21 cases passed (100 ms)
Your runtime beats 28.13 % of javascript submissions
Your memory usage beats 44.37 % of javascript submissions (39.7 MB)

双指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
* @lc app=leetcode.cn id=283 lang=javascript
*
* [283] 移动零
*/

// @lc code=start
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function (nums) {
let j = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] !== 0) {
nums[j++] = nums[i];
}
}
while (j < nums.length) {
nums[j++] = 0;
}
};
// @lc code=end
1
2
3
4
Accepted
21/21 cases passed (92 ms)
Your runtime beats 52.73 % of javascript submissions
Your memory usage beats 34.35 % of javascript submissions (39.8 MB)

392.判断子序列

Category Difficulty Likes Dislikes
algorithms Easy (50.53%) 319 -

Tags
binary-search | dynamic-programming | greedy
Companies
Unknown
给定字符串 st ,判断 s 是否为 t 的子序列。
你可以认为 st 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace""abcde"的一个子序列,而"aec"不是)。
**示例  1:**
**s** = "abc", **t** = "ahbgdc"
返回 true.
**示例  2:**
**s** = "axc", **t** = "ahbgdc"
返回 false.
**后续挑战** **:**
如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10 亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
致谢:
特别感谢** **@pbrother 添加此问题并且创建所有测试用例。


Discussion | Solution

思路

遍历 t

遍历 t,看是否存在 s

遍历 s

使用 indexof 遍历 s

解答

遍历 t

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
* @lc app=leetcode.cn id=392 lang=javascript
*
* [392] 判断子序列
*/

// @lc code=start
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isSubsequence = function (s, t) {
let k = 0;
for (let i = 0; i < t.length && k < s.length; i++) {
if (t[i] === s[k]) k++;
}
return k === s.length;
};
// @lc code=end
1
2
3
4
Accepted
15/15 cases passed (96 ms)
Your runtime beats 27.14 % of javascript submissions
Your memory usage beats 40.49 % of javascript submissions (37.9 MB)

遍历 s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
* @lc app=leetcode.cn id=392 lang=javascript
*
* [392] 判断子序列
*/

// @lc code=start
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isSubsequence = function (s, t) {
let tmp = -1;
for (let i = 0; i < s.length; i++) {
let index = t.indexOf(s[i], tmp + 1);
if (index === -1) return false;
tmp = index;
}
return true;
};
// @lc code=end
1
2
3
4
Accepted
15/15 cases passed (80 ms)
Your runtime beats 80.2 % of javascript submissions
Your memory usage beats 69.63 % of javascript submissions (37.7 MB)