返回
巧用动态规划,LeetCode算法题轻松解
前端
2024-01-14 14:30:05
算法与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上取得更好的成绩。