返回

巧用动态规划,LeetCode算法题轻松解

前端

算法与LeetCode

算法是计算机科学的基础,也是软件开发的核心。算法的本质是解决问题的方法,它可以帮助我们用最有效的方式实现目标。LeetCode是一个著名的算法题库,它提供了一系列精心设计的算法题目,供程序员们练习和提高算法技能。

JavaScript算法题解

JavaScript是一种流行的编程语言,它不仅可以用于前端开发,还可以用于后端开发和算法实现。在本文中,我们将使用JavaScript来解决LeetCode上的算法题。

字符串处理

字符串处理是算法中最常见的问题之一。在LeetCode上,有许多字符串处理的题目,例如判断回文子串、查找最长公共子序列、计算字符串编辑距离等。

// 判断回文子串

function isPalindrome(str) {
  return str === str.split('').reverse().join('');
}

// 查找最长公共子序列

function longestCommonSubsequence(str1, str2) {
  const dp = new Array(str1.length + 1).fill(0).map(() => new Array(str2.length + 1).fill(0));

  for (let i = 1; i <= str1.length; i++) {
    for (let j = 1; j <= str2.length; j++) {
      if (str1[i - 1] === str2[j - 1]) {
        dp[i][j] = dp[i - 1][j - 1] + 1;
      } else {
        dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
      }
    }
  }

  return dp[str1.length][str2.length];
}

// 计算字符串编辑距离

function editDistance(str1, str2) {
  const dp = new Array(str1.length + 1).fill(0).map(() => new Array(str2.length + 1).fill(0));

  for (let i = 0; i <= str1.length; i++) {
    dp[i][0] = i;
  }

  for (let j = 0; j <= str2.length; j++) {
    dp[0][j] = j;
  }

  for (let i = 1; i <= str1.length; i++) {
    for (let j = 1; j <= str2.length; j++) {
      if (str1[i - 1] === str2[j - 1]) {
        dp[i][j] = dp[i - 1][j - 1];
      } else {
        dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1;
      }
    }
  }

  return dp[str1.length][str2.length];
}

数据结构

数据结构是算法的基础,也是计算机科学的重要组成部分。在LeetCode上,有许多数据结构相关的题目,例如链表反转、二叉树遍历、哈希表查找等。

// 链表反转

function reverseLinkedList(head) {
  let prev = null;
  let current = head;
  let next;

  while (current) {
    next = current.next;
    current.next = prev;
    prev = current;
    current = next;
  }

  return prev;
}

// 二叉树遍历

function traverseBinaryTree(root) {
  // 前序遍历
  console.log(root.val);

  if (root.left) {
    traverseBinaryTree(root.left);
  }

  if (root.right) {
    traverseBinaryTree(root.right);
  }
}

// 哈希表查找

function findInHashTable(table, key) {
  const index = hashFunction(key);
  const bucket = table[index];

  for (let i = 0; i < bucket.length; i++) {
    if (bucket[i][0] === key) {
      return bucket[i][1];
    }
  }

  return null;
}

算法思想

算法思想是算法的核心,也是算法设计和实现的关键。在LeetCode上,有许多算法思想相关的题目,例如贪心算法、分治算法、动态规划算法等。

// 贪心算法

function findMaxSumSubarray(arr) {
  let maxSoFar = 0;
  let maxEndingHere = 0;

  for (let i = 0; i < arr.length; i++) {
    maxEndingHere = Math.max(arr[i], maxEndingHere + arr[i]);
    maxSoFar = Math.max(maxSoFar, maxEndingHere);
  }

  return maxSoFar;
}

// 分治算法

function mergeSort(arr) {
  if (arr.length === 1) {
    return arr;
  }

  const mid = Math.floor(arr.length / 2);
  const leftHalf = mergeSort(arr.slice(0, mid));
  const rightHalf = mergeSort(arr.slice(mid));

  return merge(leftHalf, rightHalf);
}

function merge(left, right) {
  const merged = [];

  while (left.length && right.length) {
    if (left[0] < right[0]) {
      merged.push(left.shift());
    } else {
      merged.push(right.shift());
    }
  }

  return merged.concat(left, right);
}

// 动态规划算法

function fibonacci(n) {
  const dp = new Array(n + 1).fill(0);
  dp[0] = 0;
  dp[1] = 1;

  for (let i = 2; i <= n; i++) {
    dp[i] = dp[i - 1] + dp[i - 2];
  }

  return dp[n];
}

结语

算法是计算机科学的基础,也是软件开发的核心。LeetCode是一个著名的算法题库,它提供了一系列精心设计的算法题目,供程序员们练习和提高算法技能。在本文中,我们使用JavaScript来解决LeetCode上的算法题,并介绍了字符串处理、数据结构和算法思想等基本概念。希望通过本文,你能对算法有更深入的理解,并在LeetCode上取得更好的成绩。