难度: 简单

题目

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. bcc 基于bpf 分析linux 系统性能的强大工具包

    bcc 是一个基于bpf 的强大linux io,网络监控分析工具集(当然也可以分析java,ruby,python...) 一张工具图 说明 bcc 好多工具是需要kernel 4.1 的,但是大部 ...

  2. 4.Vue双向绑定

    1.什么是双向数据绑定 Vue.js 是一个 MVVM 框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化.这也算是 Vue.js 的精髓之处了 ...

  3. [RN] React Native 使用 Redux 比较详细和深刻的教程

    React Native 使用 Redux 比较详细和深刻的教程 React Native 使用 Redux https://www.jianshu.com/p/06fc18cef56a http:/ ...

  4. CF1136E Nastya Hasn't Written a Legend(线段树)

    还能说什么呢,简直太妙了. $$a_{i+1}<a_i+k_i$$ $$a_{i+1}-k_i-k_{i-1}-\cdots-k_1<a_i+k_i-k_i-k_{i-1}-\cdots- ...

  5. dogcom在openwrt上的使用

    前提,先配置并运行mentohust(作为802.1x认证) 1,取得编译完成的可执行文件(可先在虚拟机里测试) 2,上传到路由器 3,把dogcom主程序和配置文件放在/etc/storage/do ...

  6. 重启服务器后Docker容器暴露的端口外网突然访问不了!!

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  7. [FY20 创新人才班 ASE] 第 1 次作业成绩

    作业概况 条目 备注 作业链接 [ASE高级软件工程]热身作业! 提交人数 19 未完成人数 2 满分 10分 作业情况总结 本次作业作为大家软工课程的第一次作业,完成度相当不错(尤其是在国外暑研/赶 ...

  8. SDK-基于Windows环境搭建

    SDK安装配置 前言:相信很多小伙伴还不会搭SDK,近日一位前同事询问我SDK怎么搭建了?不妨看看吧,小编是基于appium. 1.下载SDK:http://tools.android-studio. ...

  9. 【linux】CentOS 查看系统时间,修改时区

    ===============CentOS 7.6================ 1.查看系统时间 date 查看当前系统时间以及时区结果是: Mon Jul 8 09:23:31 UTC 2019 ...

  10. HTML5 下拉控件绑定数据

    <select id="CommunityList" class="form-control" > <option>請選擇社團</ ...