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

这道面试题是前段时间,楼主去链家的面试题,印象特别深刻。题目链接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);



你可能感兴趣的:(golang,算法,php,算法,面试题,golang,php)