难度: 简单

题目

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.

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

PHP

暴力解法

暴力解法:双重循环。时间复杂度O(N^2)。

function twoSum($nums, $target) {
$count = count($nums);
for($i=0; $i< $count; $i++){
for($j=$i+1; $j< $count; $j++){
if ($nums[$i] + $nums[$j] == $target) {
break 2;
}
}
} return [$i, $j];
}

使用HashMap

hashMap法:直接去查找对应的值的key。时间复杂度O(N)。

php里使用array模拟HashMap。 array_keys如果加了 第二个参数,表示仅返回含有该值的key。


function twoSum($nums, $target) {
$count = count($nums);
for($i=0; $i< $count; $i++){
$ele = $target - $nums[$i];
$keys = array_keys($nums, $ele);
foreach($keys as $key) {
if ( $key && $key != $i) {
return [$i, $key];
}
} } return [0,0];
}

时间复杂度:O(n)。

改进:时间O(N),空间O(N)

借助一个hashtable,每次循环的时候,发现当前值在table中找不到配对,先记录下来,key是值,值是与之配对的值的索引;如果当前值在table中找到配对,说明配对成功。

function twoSum($nums, $target) {
$table = []; //值 => 可以配对的索引
$len = count($nums);
for($i = 0; $i < $len; $i++ ) {
$value = $nums[$i];
if (isset($table[$value])) {
return [$table[$value], $i]; //配对成功
} else {
$table[$target - $nums[$i]] = $i; //记录该值配对对应的索引
}
}
}

二分法

用一个排序都能把复杂度降到O(NlogN),通过排序,然后用两个指针从前后扫描逼近真值。

注意这个思想,可以让O(N^2)的复杂度降为O(N),充分利用排序,因为一定会有一个值满足,然后通过值去原数组里找对应的下标。

function twoSum($nums, $target) {
$nums_c = $nums; //保留原数组,sort函数会修改原数组
sort($nums);
$start = 0;
$end = $count = count($nums); //两边逼近
while($start < $end){
while($nums[$start] + $nums[--$end] > $target);
if ($nums[$start] + $nums[$end] == $target) {
break;
} while($nums[++$start] + $nums[$end] < $target);
if ($nums[$start] + $nums[$end] == $target) {
break;
}
} //从原始数组里查找对应值的key
$result = [];
for($i=0; $i < $count; $i++) {
if ($nums_c[$i] == $nums[$start] || $nums_c[$i] == $nums[$end]) {
$result[] = $i;
}
} return $result;
}

时间复杂度:O(n)。

来源

链接:https://leetcode-cn.com/problems/two-sum

Leetcode——1. 两数之和的更多相关文章

  1. 前端与算法 leetcode 1. 两数之和

    目录 # 前端与算法 leetcode 1. 两数之和 题目描述 概要 提示 解析 解法一:暴力法 解法二:HashMap法 算法 传入[1, 2], [11, 1, 2, 3, 2]的运行结果 执行 ...

  2. LeetCode:两数之和、三数之和、四数之和

    LeetCode:两数之和.三数之和.四数之和 多数之和问题,利用哈希集合减少时间复杂度以及多指针收缩窗口的巧妙解法 No.1 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在 ...

  3. Leetcode 001. 两数之和(扩展)

    1.题目要求 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 2.解法一:暴力法(for*for,O(n*n)) ...

  4. LeetCode 653. 两数之和 IV - 输入 BST(Two Sum IV - Input is a BST)

    653. 两数之和 IV - 输入 BST 653. Two Sum IV - Input is a BST 题目描述 给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定 ...

  5. leetCode:twoSum 两数之和 【JAVA实现】

    LeetCode 两数之和 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标. 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素. 更多文章查看个人博客 个人博客地址:t ...

  6. Leetcode 1. 两数之和 (Python版)

    有粉丝说我一个学算法的不去做Leetcode是不是浪费,于是今天闲来没事想尝试一下Leetcode,结果果断翻车,第一题没看懂,一直当我看到所有答案的开头都一样的时候,我意识到了我是个铁憨憨,人家是让 ...

  7. Leetcode 167. 两数之和 II - 输入有序数组 By Python

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...

  8. LeetCode 167. 两数之和 II - 输入有序数组

    题目: 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的 ...

  9. 【LeetCode】 两数之和 twoSum

    两数之和 (简单) 题目描述 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数: 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 例如: 给定 nums = [2,7,11, ...

  10. 【Leetcode】两数之和,三数之和,四数之和

    两数之和 题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这 ...

随机推荐

  1. ASP.NET开发实战——(二)为什么使用ASP.NET

    本文主要内容是通过分析<博客系统>需求,确定使用Web应用的形式来开发,然后介绍了HTML.HTTP的概念,并使用IIS搭建了一个静态的HTML“页面”,从而引出“动态”的ASP.NET. ...

  2. [LeetCode] 393. UTF-8 Validation 编码验证

    A character in UTF8 can be from 1 to 4 bytes long, subjected to the following rules: For 1-byte char ...

  3. 官方入门教程和文档 | Visual Studio

    Visual Studio 2017 概述 | Microsoft Docs(直接教你用vs) https://docs.microsoft.com/zh-cn/visualstudio/ide/vi ...

  4. DingTalk钉钉消息推送(.net core 3 WebApi尝鲜记)

    我发了个朋友圈,Swagger真他妈的牛B,解放了开发API的码农,麻麻再也不用担心我们写API文档耽误回家吃饭了. /// <summary> /// 发送钉钉消息 /// </s ...

  5. ShellScript之变量

    Shell脚本之变量学习 ##########################ShellScript初学者,文章摘自菜鸟教程################################ 1.She ...

  6. laravel中如何执行请求

    laravel中如何执行request请求?本篇文章给大家介绍关于laravel中执行请求的方法,需要的朋友可以参考一下,希望对你有所帮助. 我们先来看一下request是什么? 客户端(例如Web浏 ...

  7. Gordon家族(二)

    本文是 Gordon家族(一) 的续集. 16. GoLearn 介绍:Gordon博士为Go开发者提供了一系列机器学习的库,开箱即用. 地址:https://github.com/sjwhitwor ...

  8. Dozer JAVA的POJO 映射工具

    Dozerhttp://www.manongjc.com/article/50949.html JAVA的映射工具 BeanUtils dozer的使用方法https://blog.csdn.net/ ...

  9. Queue接口分析:add和offer区别,remove和poll方法到底啥区别

    Queue接口: public interface Queue<E> extends Collection<E> { /* * add方法,在不违背队列的容量限制的情况,往队列 ...

  10. dotnet学习系列

    这里整理下之前关于dotnet方面的文章索引. 一.dotnet core 系列 dotnet core 微服务教程 asp.net core 系列之并发冲突 asp.net core 系列之中间件进 ...