Leetcode——1. 两数之和
难度: 简单
题目
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. 两数之和的更多相关文章
- 前端与算法 leetcode 1. 两数之和
目录 # 前端与算法 leetcode 1. 两数之和 题目描述 概要 提示 解析 解法一:暴力法 解法二:HashMap法 算法 传入[1, 2], [11, 1, 2, 3, 2]的运行结果 执行 ...
- LeetCode:两数之和、三数之和、四数之和
LeetCode:两数之和.三数之和.四数之和 多数之和问题,利用哈希集合减少时间复杂度以及多指针收缩窗口的巧妙解法 No.1 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在 ...
- Leetcode 001. 两数之和(扩展)
1.题目要求 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 2.解法一:暴力法(for*for,O(n*n)) ...
- LeetCode 653. 两数之和 IV - 输入 BST(Two Sum IV - Input is a BST)
653. 两数之和 IV - 输入 BST 653. Two Sum IV - Input is a BST 题目描述 给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定 ...
- leetCode:twoSum 两数之和 【JAVA实现】
LeetCode 两数之和 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标. 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素. 更多文章查看个人博客 个人博客地址:t ...
- Leetcode 1. 两数之和 (Python版)
有粉丝说我一个学算法的不去做Leetcode是不是浪费,于是今天闲来没事想尝试一下Leetcode,结果果断翻车,第一题没看懂,一直当我看到所有答案的开头都一样的时候,我意识到了我是个铁憨憨,人家是让 ...
- Leetcode 167. 两数之和 II - 输入有序数组 By Python
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...
- LeetCode 167. 两数之和 II - 输入有序数组
题目: 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的 ...
- 【LeetCode】 两数之和 twoSum
两数之和 (简单) 题目描述 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数: 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 例如: 给定 nums = [2,7,11, ...
- 【Leetcode】两数之和,三数之和,四数之和
两数之和 题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这 ...
随机推荐
- <DFS & BFS> 130 127
130. Surrounded Regions BFS: 把所有边界上的O先换成A(标记),再深度遍历周围的点. 最后把O换成X(表示不符合要求),所有的A换回O class Solution { p ...
- [LeetCode] 843. Guess the Word 猜单词
This problem is an interactive problem new to the LeetCode platform. We are given a word list of uni ...
- cordova生成签名的APK
所有的Android应用程序在发布之前都要求用一个证书进行数字签名,anroid系统是不会安装没有进行签名的程序(安全考虑,可以查找相关文档) 签名过程详情见:https://www.cnblogs. ...
- Spring事物隔离级别及事物传播行为@Transactional实现
阅读本篇文章前,请先阅读如下文章: 四种事物隔离级别详解 先看下@Transactional可以配制那些参数及以其所代表的意义. isolation 枚举org.springframework.tra ...
- 云服务器、VPS、虚拟主机三者之间的区别?
更多精彩内容欢迎访问我的个人博客皮皮家园:https://www.zh66.club期待您的光临哦!我是皮皮猪,感谢各位光临,能为您排忧解难小站深感荣幸!祝您生活愉快! 什么是虚拟主机? 同云主机不一 ...
- 错误:PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。"+文件路径"的解决方案
最近在使用python进行筛选图片的时候,想到用python里面的os库进行图片的删除. 具体筛选方法就是,删除掉图片长度或宽度小于100像素的图片,示例代码如下所示: for file in os. ...
- Unity Shader 2D水流效果
水流的模拟主要运用了顶点变换和纹理动画的结合: 顶点变换中,利用正弦函数模拟河流的大致形态,例如波长,振幅等. 纹理动画中,将纹理坐标朝某一方向持续滚动以形成流动的效果. 脚本如下: Shader & ...
- golang学习笔记 ---rand
在Golang中,有两个包提供了rand,分别为 "math/rand" 和 "crypto/rand", 对应两种应用场景. "math/rand ...
- 基于 Ubuntu 系统安装 CUDA 和 cuDNN
************************************************ 显卡:GTX 1050Ti 系统:Ubuntu 18.0.4 安装的CUDA:10.0 版本 **** ...
- 轻量级ORM《sqlcommon》第一个版本发布了!!!
一.sqlcommon的特色 1. 轻量级,整个包只有123kb. 2. 性能好,自测... 3. API和功能简单.代码简短.可维护性好基本都能看懂.这个点我认为很重要,你不用为了实现一个需求而四处 ...