LeetCode 1. Two Sum(两数之和)

277 阅读1分钟

leetcode.com/problems/tw…

Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.

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

You can return the answer in any order.

Example 1:

Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Output: Because nums[0] + nums[1] == 9, we return [0, 1].

Example 2:

Input: nums = [3,2,4], target = 6
Output: [1,2]

Example 3:

Input: nums = [3,3], target = 6
Output: [0,1]

Constraints:

  • 2 <= nums.length <= 104

  • -109 <= nums[i] <= 109

  • -109 <= target <= 109

  • Only one valid answer exists.

Follow-up: Can you come up with an algorithm that is less than O(n2) time complexity?

解法一:

暴力求解,复杂度为 O(N²)。

class Solution {
    fun twoSum(nums: IntArray, target: Int): IntArray {
        val result = mutableListOf<Int>()

        for (i in nums.indices) {
            val x = nums[i]
            for (j in i + 1 until nums.size) {
                val y = nums[j]
                if (x + y == target) {
                    result.add(i)
                    result.add(j)
                }
            }
        }
        return result.toIntArray()
    }
}

解法二:

利用 Map 保存下标与下标对应的值,复杂度 O(N)。

class Solution {
    fun twoSum(nums: IntArray, target: Int): IntArray {
        val result = mutableListOf<Int>()
        val map = mutableMapOf<Int, Int>()

        for (index in nums.indices) {
            map[index] = nums[index]
        }

        for (index in nums.indices) {
            val x = nums[index]
            val y = target - x
            if (map.containsValue(y) && map.values.lastIndexOf(y) > index) {
                result.add(index)
                result.add(map.values.lastIndexOf(y))
            }
        }
        return result.toIntArray()
    }
}