TwoSum

一. leetcode描述

概述

  1. 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
  2. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例

  • 给定 nums = [2, 7, 11, 15], target = 9
  • 因为 nums[0] + nums[1] = 2 + 7 = 9
  • 所以返回 [0, 1]

二. 程序实现

1. Python实现

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """

算法一

length = len(nums)
for i in range(length):
    diff_num = target - nums[i]  # 求差
    if diff_num in nums:  # 差值在nums中
        j = nums.index(diff_num)  # 计算+记录差值下标
        if i != j:    # 非同一个元素
            return i, j  # 以元组形式返回
# else:
#     return None  # 可省略,Python函数默认返回None

时间空间复杂度

  1. 时间复杂度
  2. 空间复杂度

算法二

dic = {}    # 键: 差值    值: 差值下标
length = len(nums)
for i in range(length):
    diff_num = target - nums[i]
    if nums[i] in dic:    # 当前遍历数字nums[i]在字典dic键视图dic.keys()中
        return dic[nums[i]], i
    else:   # 添加键值对到字典dic
        dic[diff_num] = i

时间空间复杂度

  1. 时间复杂度
  2. 空间复杂度

算法三: 暴力循环遍历

length = len(nums)
for i in range(length):    # 遍历
    for j in range(i+1, length):    # +1遍历
        diff_num = target - nums[i]
        if diff_num == nums[j]:
            return i, j

时间空间复杂度

  1. 时间复杂度
  2. 空间复杂度

2.Golang实现

算法一: 求差值

func twoSum(nums []int, target int) []int {
for i, v := range nums {
		diffNum := target - v
		index := isContain01(diffNum, i, nums)
		if index >= 0 {
			return []int{i, index}
		}
	}
	return nil
}

func isContain01(diffNum, i int, nums []int) int {
	for i := i + 1; i < len(nums); i++ {
		if diffNum == nums[i] {
			return i
		}
	}
	return -1
}

时间空间复杂度

  1. 时间复杂度
  2. 空间复杂度
    在这里插入图片描述

算法二

func twoSum(nums []int, target int) []int {
    dic := make(map[int]int)
	for i, v1 := range nums {
		diffNum := target - v1
		if isContain(dic, v1) {
			return []int{dic[nums[i]], i}
		} else {
			dic[diffNum] = i
		}
	}
	return nil
}

func isContain(dic map[int]int, v1 int) bool {
	for k, _ := range dic {
		if v1 == k {
			return true
		}
	}
	return false
}

时间空间复杂度

  1. 时间复杂度
  2. 空间复杂度

算法三: 暴力循环

func twoSum(nums []int, target int) []int {
    length := len(nums)
	for i, v := range nums {
		diffNum := target - v
		for j := i + 1; j < length; j++ {
			if diffNum == nums[j] {
				return []int{i, j}
			}
		}
	}
	return nil
}

时间空间复杂度

  1. 时间复杂度
  2. 空间复杂度

2.C/C++实现


参考: http://www.cnblogs.com/bibi-feiniaoyuan/p/9260172.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值