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].
1.暴力破解,刚接触这到题的时候,我最容易想到的就是直接暴力求,双循环,算法复杂度n^2。
```php
class Solution {
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function twoSum($nums, $target) {
for($i=0;$i<count($nums);$i++){
for($j = $i+1;$j<count($nums);$j++){
if($nums[$i]+$nums[$j]==$target){
return [$i,$j];
}
}
}
return [];
}
}
2.受桶排序的启发,将数组第一遍循环将数字转为另一个数组的下标,第二遍循环,查找[target-下标]值是否存在,其中考虑,target-v=k的问题。
class Solution {
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function twoSum($nums, $target) {
$has = [];
foreach($nums as $k=>$v){
$has[$v] = $k;
}
foreach($nums as $k=>$v){
if(isset($has[$target - $v]) && $target - $v!= $k){
return [$k,$has[$target-$v]];
}
}
return [];
}
}
3.对桶排序的优化,可以在循环时即判断又写入,同时可以避免target - v = k问题。
php版本
class Solution {
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer[]
*/
function twoSum($nums, $target) {
$numss = array();
foreach($nums as $k=>$v){
if(isset($numss[$v])){
return [$numss[$v],$k];
}
$numss[$target - $v] = $k;
}
return [];
}
}
go版本
func twoSum(nums []int, target int) []int {
numss := make(map[int]int,len(nums))
for k,v := range nums{
if c,ok := numss[v];ok{
return []int{c,k}
}
numss[target - v] = k
}
return []int{}
}
第一次做这道题时,我最先考虑到的是暴力,第二次考虑到了之前的桶排序思路,最后一种是对桶排序的优化,这个数组是从小到大排列的有序数组,target - v 所生成的目标值一定是在当前v之后的,基于这种情况就可以边循环边写入数组里面,如果有存在值时输出即可,同时可以完全不考虑target - v = k情况,如果后面看到更优解再补充。