LeetCode算法训练

目的

  • 熟悉新近学习的编程语言各种语法糖,最大化的精简代码。
  • 复习基本数据结构和基本算法,提高代码效率。
  • 训练持久力。

说明

掌握数据结构

  • 数组与链表:单 / 双向链表
  • 栈与队列
  • 哈希表
  • 堆:最大堆 / 最小堆
  • 树与图:最近公共祖先、并查集
  • 字符串:前缀树(字典树) / 后缀树
  • ...

掌握基础算法

  • 基础技巧:分治、二分、贪心
  • 排序算法:快速排序、归并排序、计数排序
  • 搜索算法:回溯、递归、深度优先遍历,广度优先遍历,二叉搜索树等
  • 图论:最短路径、最小生成树
  • 动态规划:背包问题、最长子序列
  • ...

常用数据结构和方法

  • LeetCode提供的样本输入,显示上是数组Array,而后台的实际测试用例则是树TreeNode,链表ListNode等。
  • 如果你是在页面手撸代码直接提交的,那没什么影响。
  • 如果你是在本地IDE编写的代码,你就需要把样本输入拷贝下来,转换成相应的数据类型,再编写核心算法进行测试。
  • 我们只需要提交核心算法,不需要提交测试数据初始化代码。
  • ...

ListNode

function ListNode(val) {
    this.val = val;
    this.next = null;
}

arrayToListNode

/**
 * @param {number[]} arr
 * @return {ListNode}
 */
function arrayToListNode(arr) {
    if (arr.length === 0) return null;
    let root = new ListNode(arr.shift());
    root.next = arrayToListNode(arr);
    return root;
}

arrayToListNodeArray

/**
 * @param {number[][]} arr
 * @return {ListNode[]}
 */
function arrayToListNodeArray(arr) {
    let result = [];
    for (let a of arr) {
        let dummy = new ListNode();
        let head = dummy;
        for (let i of a) {
            dummy.next = new ListNode(i);
            dummy = dummy.next;
        }
        result.push(head.next);
    }
    return result;
}
原文地址:https://www.cnblogs.com/zenronphy/p/LeetCodeTrainingBase.html