LeetCode - 1.Two Sum

原创文章转载请注明出处

Two Sum
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.

Example:

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

这道题我个人认为使用哈希表是比较经济实用的解决方式。类似C这样默认不支持HashMap的语言可以先对数组进行快速排序,再对已排序数组进行查找,复杂度也是O(n),从执行效率上看也是C的方案最快。而Python往往能写出最简短的代码。

Swift

两重循环遍历,复杂度 O(n^2)。

class Solution {
    func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
        for var i in 0 ..< nums.count {
            for var j in i+1 ..< nums.count {
                if nums[i] + nums[j] == target {
                    return [i, j]
                }
            }
        }
        return [0,0]
    }
}

哈希表优化版,复杂度降低到O(n)。

class Solution {
    func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
        var hash: [Int : Int] = [:]
        for (i, n) in nums.enumerated() {
            if let index = hash[target - n] {
                return [index, i]
            }
            hash[n] = i
        }
        return []
    }
}

Go

func twoSum(nums []int, target int) []int {
  hash := make(map[int]int)
  for i, n := range nums {
    key := target - n
    if index, ok := hash[key]; ok {
      return []int{index, i}
    }
    hash[n] = i
  }
  return []int{}
}

Java

public class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> hash=new HashMap<>();
        int result[] = new int[2];
        for (int i=0;i<nums.length;i++) {
            if (pair.containsKey(nums[i])) {
                result[0]=hash.get(nums[i]);
                result[1]=i;
                return result;
            } else {
                hash.put(target-nums[i], i);
            }
        }
        return result;
    }
}

JavaScript

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    let hashTable = {};
    for(let i=0; i<nums.length; i++){
        let num   = nums[i];
        let index = hashTable[target-num];
        if(index !== undefined) return [index, i]
        hashTable[num] = i;
    }
};

C

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int cmp(const void *a, const void *b) {
    return *(int *)a - *(int *)b;
}
int *twoSum(int *nums, int numsSize, int target) {
    int i, j;
    int *ret;
    int *temp;
    ret = (int *) malloc(2 * sizeof(int));
    temp = (int *) malloc(numsSize * 2 * sizeof(int));
    for (i = 0; i < numsSize; i++) {
        temp[2 * i] = nums[i];
        temp[2 * i + 1] = i;
    }
    qsort(temp, numsSize, 2 * sizeof(temp[0]), cmp);
    i = 0;
    j = numsSize - 1;
    while (temp[2 * i] + temp[2 * j] != target) {
        if (temp[2 * i] + temp[2 * j] > target) {
            --j;
        } else if (temp[2 * i] + temp[2 * j] < target) {
            ++i;
        } else {
            break;
        }
    }
    ret[0] = temp[2 * i + 1] < temp[2 * j + 1] ? temp[2 * i + 1] : temp[2 * j + 1];
    ret[1] = temp[2 * i + 1] > temp[2 * j + 1] ? temp[2 * i + 1] : temp[2 * j + 1];
    return ret;
}

Python

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        d = { }
        for i, n in enumerate(nums):
            if target - n in d:
                return [min(i, d[target-n]), max(i, d[target-n])]
            d[n] = i

变态版,看看代码思路就好。执行效率比较低,原题没有要求遍历出所有结果,这个解法返回数据太多了,虽然能通过测试,但是时间比较长。

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        l=len(nums)
        r=range(l)
        t=[x for x in r if (target-nums[x]) in (nums[:x]+nums[x+1:])]
        return t

我是咕咕鸡,一个还在不停学习的全栈工程师。
热爱生活,喜欢跑步,家庭是我不断向前进步的动力。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容