一:题号118 杨辉三角
1.1 题干内容
1.2 思路分析
1、本题涉及到了数学中杨辉三角,对于数学有一定的基础要求,对于题目中所给的杨辉三角特性还不足以给出本道题目的解答,需要进一步的了解杨辉三角的数学性质。目前仅能确定杨辉三角中本行的每一位的数据与上一行中相同位加上前一位的和相同。
2、补充的杨辉三角的性质如下:
1.3 本题代码
/**
* @param {number} numRows
* @return {number[][]}
*/
var generate = function(numRows) {
//此道题考察杨辉三角的基本性质,声明初始化一个作为返回值的空数组
let restArray=[];
for(let i=0;i<numRows;i++){
//杨辉三角中每一行都是一个数组,其元素的数目与所在行数的位置有关
let row=new Array(i+1).fill(1);
//对每一行的元素进行计算得出,需要注意的是第一项和最后一项都是1
for(let j=1;j<row.length-1;j++){
row[j]=restArray[i-1][j]+restArray[i-1][j-1];
}
restArray.push(row)
}
return restArray;
};
1.4 解法性能
二、题号387 字符串中的第一个唯一字符
2.1 题干内容如下
2.2 思路分析
1、目的是找到给定字符中第一个不重复的字符,并返回其在字符串中的索引值。
2、对于限定出现次数要求的查找条件,我们应该很自然的想到的就是先利用哈希表将字符串中每一个字符出现的次数以键值对的形式进行存储。
3、对给定的字符串进行第二次迭代,找到哈希表中第一个出现次数为1的字符,并返回其下标值即可。本题的整体思路较为清晰。
2.3 本题代码
/**
* @param {string} s
* @return {number}
*/
var firstUniqChar = function(s) {
//返回字符串中第一个不重复的字符
//对于需要统计出现次数的问题,可以先使用哈希表存储每一个元素字母出现的次数
let map=new Map();
//第一次遍历用于存储每一个元素出现的次数
for(let i=0;i<s.length;i++){
let item=s.charAt(i);
if(map.has(item)){
let occurNumber=map.get(item);
map.set(item,occurNumber+1);
}else{
map.set(item,1);
}
}
//第二次遍历,找出哈希表中存储的仅出现一次的数组的下标
for(let i=0;i<s.length;i++){
if(map.get(s.charAt(i))===1){
return i;
}
}
return -1;
};
2.4 性能分析
三、二叉树的前序遍历
3.1 题干内容
3.2 思路分析
1、二叉树作为一种应用极其广泛的数据结构,其前序遍历、中序遍历、后序遍历三种遍历方式是需要我们熟悉掌握的,快速记忆其区别就是在于二叉树的根节点的遍历时间。
2、本题可以使用栈结构存储需要输出的二叉树的前序遍历结果组成的数组。需要注意的是栈具有后入先出的特性,因此在入栈的时候为保证输出的是前序遍历的结果,先将其右子树的节点入栈,再将其左子树的节点入栈。明白这一点做起题来就会容易很多了。
3.3 本题代码
/**
* @param {TreeNode} root
* @return {number[]}
*/
var preorderTraversal = function(root) {
//借助栈结构具有后进先出的特性
//给定的是一个二叉树结构,其每一个子项都具有left和right的属性,但是其整体并不具备。
let rest=[];
if(!root){
return rest;
}
let stack=[root];
while(stack.length!==0){
let node=stack.pop();
rest.push(node.val);
if(node.right){
stack.push(node.right);
}
if(node.left){
stack.push(node.left);
}
}
return rest;
};
3.4 性能分析