LeetCode 热题 HOT 100 JavaScript题解

560 阅读3分钟

1. 两数之和

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    let index = 0
    while(index < nums.length) {
        let temp = nums.lastIndexOf(target - nums[index])
        if(temp > index) return [index, temp]
        index++
    }
};

2. 两数相加

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
    const trans = node => node.next? BigInt(node.val) + trans(node.next) * BigInt(10) : BigInt(node.val)
    const sum = trans(l1) + trans(l2)
    let node = new ListNode()
    let ans = node
    let length = sum.toString().length
    sum.toString().split('').reverse().forEach((item, index) => {
        node.val = Number(item)
        node.next = index < length - 1? new ListNode() : null
        node = node.next
    })
    return ans
};

3. 无重复字符的最长子串

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    if(s.length == 0) return 0
    let ans = 0
    let set = new Set()
    let l = 0, r = 0
    while(r < s.length) {
        if(!set.has(s[r])) {
            set.add(s[r])
            ans = Math.max(ans, set.size)
        }
        else {
            while(set.has(s[r])) {
                set.delete(s[l])
                l++
            }
            set.add(s[r])
        }
        r++
    }
    return ans
};

4. 寻找两个正序数组的中位数

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
var findMedianSortedArrays = function(nums1, nums2) {
    let nums = [...nums1, ...nums2].sort((a, b) => a - b)
    let len = nums.length
    let mid = Math.floor(len/2)
    return len%2 == 0? (nums[mid - 1] + nums[mid])/2 : nums[mid]
};

11. 盛最多水的容器

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
    let [l, r] = [0, height.length - 1]
    let ans = 0
    while(l < r) {
        ans = Math.max(ans, Math.min(height[l], height[r]) * (r - l))
        if(height[l] < height[r]) l++
        else r--
    }
    return ans
};

17. 电话号码的字母组合

/**
 * @param {string} digits
 * @return {string[]}
 */
const map = {
    2: 'abc',
    3: 'def',
    4: 'ghi',
    5: 'jkl',
    6: 'mno',
    7: 'pqrs',
    8: 'tuv',
    9: 'wxyz'
}
var letterCombinations = function(digits) {
    let ans = []
    if(digits.length == 0) return ans
    const solve = (index, result) => {
        if(index == digits.length) ans.push(result)
        else {
            map[digits[index]].split('').forEach(word => solve(index + 1, result + word))
        }
    }
    solve(0, '')
    return ans
};

20. 有效的括号

/**
 * @param {string} s
 * @return {boolean}
 */
 const map = {
  '(':')',
  '[':']',
  '{':'}'
}
var isValid = function(s) {
    let stack = []
    s = s.split('')
    while(s.length!=0) {
        let temp = s.shift()
        if(map[stack[stack.length-1]]==temp) stack.pop()
        else stack.push(temp)
    }
    return stack.length == 0
};

21. 合并两个有序链表

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} list1
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeTwoLists = function(list1, list2) {
    const trans = node => {
        let array = []
        while(node) {
            array.push(node.val)
            node = node.next
        }
        return array
    }
    const list = [...trans(list1), ...trans(list2)].sort((a, b) => a - b)
    let ans = new ListNode()
    let p = ans
    list.forEach(item => {
        p.next = new ListNode(item)
        p = p.next
    })
    return ans.next
};

34. 在排序数组中查找元素的第一个和最后一个位置

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var searchRange = function(nums, target) {
    return [nums.indexOf(target), nums.lastIndexOf(target)]
};

39. 组合总和

/**
 * @param {number[]} candidates
 * @param {number} target
 * @return {number[][]}
 */
var combinationSum = function(candidates, target) {
    let ans = []
    candidates.sort((a, b) => a - b)
    const solve = (index, target, array) => {
        if(target < 0) return
        if(target == 0) return ans.push(array)
        for(let i = index; i < candidates.length; i++) {
            solve(i, target - candidates[i], [...array, candidates[i]])
        }
    }
    solve(0, target, [])
    return ans
};

46. 全排列

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function(nums) {
    let ans = []
    const solve = (cur, rest) => {
        if(cur.length == nums.length) ans.push(cur)
        rest.forEach(e => solve([...cur, e], rest.filter(num => num!=e)))
    }
    solve([], nums)
    return ans
};

53. 最大子数组和

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    if(nums.length == 1) return nums[0]
    let ans = nums[0]
    let dp = [nums[0]]
    for(let i = 1; i < nums.length; i++) {
        dp[i] = dp[i - 1] > 0? dp[i - 1] + nums[i] : nums[i]
        ans = Math.max(ans, dp[i])
    }
    return ans
};

56. 合并区间

/**
 * @param {number[][]} intervals
 * @return {number[][]}
 */
var merge = function(intervals) {
    intervals.sort((a, b) => a[0] - b[0])
    let ans = [intervals[0]]
    for(let interval of intervals) {
        if(ans.slice(-1)[0][1] >= interval[0]) {
            ans.slice(-1)[0][1] = Math.max(ans.slice(-1)[0][1], interval[1])
        } else {
            ans.push(interval)
        }
    }
    return ans
};

62. 不同路径

/**
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var uniquePaths = function(m, n) {
    let dp = Array.from(Array(m), () => Array(n).fill(1))
    for(let i = 1; i < m; i++)
        for(let j = 1; j < n; j++)
            dp[i][j] = dp[i-1][j] + dp[i][j-1]
    return dp[m-1][n-1]
};

70. 爬楼梯

/**
 * @param {number} n
 * @return {number}
 */
var climbStairs = function(n) {
    let dp = []
    dp.push(0, 1, 2)
    for(let i = 3; i <= 45; i++)
        dp.push(dp[i - 1] + dp[i - 2])
    return dp[n]
};

75. 颜色分类

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var sortColors = function(nums) {
    nums.sort()
};

94. 二叉树的中序遍历

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function(root, ans = []) {
    if(!root) return ans
    inorderTraversal(root.left, ans)
    ans.push(root.val)
    inorderTraversal(root.right, ans)
    return ans
};

101. 对称二叉树

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isSymmetric = function(root) {
    if(root == null) return true
    const dfs = (p, q) => {
        if(p == null && q == null) return true
        if([p, q].includes(null)) return false
        if(p.val != q.val) return false
        return dfs(p.left, q.right) && dfs(p.right, q.left)
    }
    return dfs(root.left, root.right)
};

104. 二叉树的最大深度

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxDepth = function(root) {
    return root? Math.max(maxDepth(root.left), maxDepth(root.right)) + 1 : 0
};

136. 只出现一次的数字

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    const count = nums.reduce((pre, cur)=> {
        pre[cur]? pre[cur]++ : pre[cur] = 1
        return pre
    }, {})
    return Object.entries(count).sort(([key1, value1], [key2, value2]) => value1 - value2)[0][0]
};

169. 多数元素

/**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function(nums) {
    const count = nums.reduce((pre, cur)=> {
        pre[cur]? pre[cur]++ : pre[cur] = 1
        return pre
    }, {})
    return Object.entries(count).sort(([key1, value1], [key2, value2]) => value2 - value1)[0][0]
};

206. 反转链表

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    let [pre, cur] = [null, head]
    while(cur) [cur.next, pre, cur] = [pre, cur, cur.next]
    return pre
};

283. 移动零

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    for(let i = 0, l = nums.length; i < l; i++) {
        if(nums[i] == 0) {
            nums.splice(i, 1)
            nums.push(0)
            i--
            l--
        }
    }
};

287. 寻找重复数

/**
 * @param {number[]} nums
 * @return {number}
 */
var findDuplicate = function(nums) {
    const count = nums.reduce((pre, cur) => {
        pre[cur]? pre[cur]++ : pre[cur] = 1
        return pre
    }, {})
    return Object.entries(count).sort(([key1, value1], [key2, value2]) => value2 - value1)[0][0]
};

448. 找到所有数组中消失的数字

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var findDisappearedNumbers = function(nums) {
    let range = Array(nums.length).fill().map((_, index) => index + 1)
    return range.filter(item => !nums.includes(item))
};

461. 汉明距离

/**
 * @param {number} x
 * @param {number} y
 * @return {number}
 */
var hammingDistance = function(x, y) {
    return (x^y).toString(2).split('').filter(i => i == '1').length
};

647. 回文子串

/**
 * @param {string} s
 * @return {number}
 */
const judge = str => str.split('').reverse().join('') == str
var countSubstrings = function(s) {
    let ans = 0
    for(let i = 0; i < s.length; i++)
        for(let j = i + 1; j < s.length + 1; j++)
            if(judge(s.slice(i, j))) ans++
    return ans
};