算法刷题

120 阅读1分钟

两数之和

原题地址:leetcode-cn.com/problems/tw…

题目及解法分析

  • 解法
    • 双循环 O(n ^ 2)
    • 一次循环 + map O(n)

图解分析

js实现

<script>
        /**
         *  双循环 O(n ^ 2)
         */
         var twoSum = function(nums, target) {
            if(nums.length < 2) {
                return []
            }
            for(let i = 0; i < nums.length - 1; i++) {
                for(let j = i + 1; j < nums.length; j++) {
                    if(nums[i] + nums[j] == target) {
                        return [i, j]
                    }
                }
            }
            return []
        }

        /**
         *  一次循环+map O(n)
         */
        var twoSum = function(nums, target) {
            if(nums.length < 2) {
                return []
            }
            let mapNew = new Map()
            let complete
            for(let i = 0; i < nums.length; i++) {
                complete = target - nums[i]
                if(mapNew.has(complete)) {
                    return [mapNew.get(complete), i] 
                }
                mapNew.set(nums[i], i)
            }
        };
        console.log(twoSum([2, 7, 11, 15], 9))
    </script>

总结

/**
 * 1. 暴力两重循环 注意 j = i + 1
 * 
 * 2. 一层循环 + map
 *    如果 map 中,没有 9 - 2 = 77 那么把 22 的下标放进 map 中
 *    如果有,返回 map 中 7 的下标,以及 2 的下标
 */