经典算法面试题系列(一)——tow sum

5 篇文章 0 订阅
2 篇文章 0 订阅

这道面试题是前段时间,楼主去链家的面试题,印象特别深刻。题目链接https://leetcode.com/problems/two-sum/#/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].
中文翻译大概是这样的,有一个整数数组,给定一个数,需要找到相加等于这个数的两个数组下标。楼主当时不知道怎么想的,是不是可以使用二分查找呢?时间复杂度怎么着也得O(logn)。但是看了看各位大神答案,方知自己无知。大神们普遍使用一个hashMap就解决,时间复杂度O(n)。二分查找需要对这个数组进行排序,O(logn)好像也不是很高。
看了看大神们的各种答案,自己捣鼓了一个自己的。

1.golang版

package main

import "fmt"

func main() {
	var nums = []int{2, 7, 11, 15}
	r := towSum(nums, 18)
	fmt.Println(r)
}

func towSum(nums []int, target int) []int {
	n := len(nums)
	if n <= 1 {
		return []int{0, 0}
	}

	numMap := make(map[int]int)
	var r []int
	for i := 0; i < n; i++ {
		key := target - nums[i]
		_, ok := numMap[key]
		if ok {
			r = append(r, numMap[key], i)
		} else {
			numMap[nums[i]] = i
		}
	}

	return r
}

2.php版

function twoSum($nums, $target) {
        $n = count($nums);
        if($n <= 1) {
            return [0, 0];
        }

        $mapNum = [];
        for ($i = 0;$i < $n;$i ++) {
            $key = $target - $nums[$i];
            if (isset($mapNum[$key])) {
                return [$mapNum[$key], $i];
            } else {
                $mapNum[$nums[$i]] = $i;
            }
        }

        return [];
    }

    $nums = [2, 7, 11, 15];
    $b = twoSum($nums, 26);
    var_dump($b);



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值