美文网首页
Leetcode 解题记录

Leetcode 解题记录

作者: DogRod | 来源:发表于2017-09-18 18:04 被阅读0次

    Two sum

    From https://leetcode.com/problems/two-sum/description/

    Description

    Given an array of integers, return indices of the two numbers such that they add up to a specific target.

    You may assume that each input would have exactly one solution, and you may not use the same element twice.

    Example:

    Given nums = [2, 7, 11, 15], target = 9,
    Because nums[0] + nums[1] = 2 + 7 = 9,
    return [0, 1].
    

    #1 for(暴力方式)

    Runtime: 195ms

    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {number[]}
     */
    var twoSum = function(nums, target) {
        for (let i = 0; i < nums.length; i++) {
            for (let j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] === target) {
                    return [i, j]
                }
            }
        }
    };
    

    Climbing Stairs

    From https://leetcode.com/problems/climbing-stairs/description/

    Description

    You are climbing a stair case. It takes n steps to reach to the top.

    Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

    Note: Given n will be a positive integer.

    Example 1:

    Input: 2
    Output:  2
    Explanation:  There are two ways to climb to the top.
    
    1. 1 step + 1 step
    2. 2 steps
    

    Example 2:

    Input: 3
    Output:  3
    Explanation:  There are three ways to climb to the top.
    
    1. 1 step + 1 step + 1 step
    2. 1 step + 2 steps
    3. 2 steps + 1 step
    

    #1 递归(从上至下)

    Time Limit Exceeded

    /**
     * @param {number} n
     * @return {number}
     */
    var climbStairs = function(n) {
        if (n === 0 || n === 1) {
            return 1
        }
        
        return climbStairs(n-1) + climbStairs(n-2)
        
    };
    

    #2 使用数组(从下至上)

    Runtime: 82ms

    /**
     * @param {number} n
     * @return {number}
     */
    var climbStairs = function(n) {
        const arr = []
        arr[0] = 1
        arr[1] = 1
        
        for (let i = 2; i <= n+1; i++) {
            arr[i] = arr[i-1] + arr[i-2]
        }
        
        return arr[n]
    };
    

    Reference


    Isomorphic Strings

    From https://leetcode.com/problems/isomorphic-strings/description/

    Description

    Given two strings s and t, determine if they are isomorphic.

    Two strings are isomorphic if the characters in s can be replaced to get t.

    All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.

    For example,
    Given "egg", "add", return true.

    Given "foo", "bar", return false.

    Given "paper", "title", return true.

    Note:
    You may assume both s and t have the same length.

    #1 记录并检查字母第一次出现的位置

    Runtime: 88ms

    /**
     * @param {string} s
     * @param {string} t
     * @return {boolean}
     */
    var isIsomorphic = function(s, t) {
        if (s.length <= 1) return true
        
        let alphabetIndexMap = {
            first: {},
            second: {},
        }
        
        for(let i = 0; i < s.length; i++) {
            const firstWordCurrentAlphabet = s.substr(i, 1)
            const secondWordCurrentAlphabet = t.substr(i, 1)
            
            const firstWordCurrentAlphabetFirstIndex = alphabetIndexMap.first[firstWordCurrentAlphabet]
            const secondWordCurrentAlphabetFirstIndex = alphabetIndexMap.second[secondWordCurrentAlphabet]
            
            if (!firstWordCurrentAlphabetFirstIndex && !secondWordCurrentAlphabetFirstIndex) {
                alphabetIndexMap.first[firstWordCurrentAlphabet] = i
            }
            
            if (!secondWordCurrentAlphabetFirstIndex) {
                alphabetIndexMap.second[secondWordCurrentAlphabet] = i
            }
            
            if (firstWordCurrentAlphabetFirstIndex !== secondWordCurrentAlphabetFirstIndex) {
                return false
            }
        }
        
        return true
    }
    

    Merge Two Sorted Lists

    Description

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

    Example:

    Input: 1->2->4, 1->3->4
    Output: 1->1->2->3->4->4
    

    #1 递归查找下一项并push进数组,最后使用sort函数

    Runtime: 122 ms

    /**
     * Definition for singly-linked list.
     * function ListNode(val) {
     *     this.val = val;
     *     this.next = null;
     * }
     */
    /**
     * @param {ListNode} l1
     * @param {ListNode} l2
     * @return {ListNode}
     */
    var mergeTwoLists = function(l1, l2) {
        let result = []
    
        const getVal = (list, list2) => {
            if (list && list.val !== null) {
                result.push(list.val)
            }
            
            if ((!list || list.val === null || !list.next) && list2) {
                return getVal(list2)
            }
    
            if (list && list.next) {
                return getVal(list.next, list2)
            }
            
            return result
        }
        
        return getVal(l1, l2).sort((a, b) => a-b)
        
    };
    

    注意:这里有两个需要注意的点

    1. 输入的listNode有可能为空或者为0,不可以直接使用 !list.val 判断
    2. sort 函数不传入参数时默认是按照元素的ascii码增序排序的,负数排序存在问题,故传入 (a, b) => a-b 进行简单排序。

    相关文章

      网友评论

          本文标题:Leetcode 解题记录

          本文链接:https://www.haomeiwen.com/subject/mfbbsxtx.html