Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode——Two Sum

LeetCode——Two Sum

作者头像
felixzhao
发布于 2018-03-16 09:46:30
发布于 2018-03-16 09:46:30
64200
代码可运行
举报
文章被收录于专栏:null的专栏null的专栏
运行总次数:0
代码可运行

题目:

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9 Output: index1=1, index2=2

解题过程:

1、分析

   题目的意思是在一个数组中找到两个数,这样的两个数的和等于指定的数,最终返回这样的两个数的下标。

   注意点:

  1. 返回的下标中index1<index2;
  2. 下标不是从0开始的;
  3. 并没有说数组是有序的。

2、解题思路

2.1若是有序数组

   对于有序数组,可以通过从两端向中间的方法来进行查找,具体过程如下:

对于数组{2,7,11,15},查找的两个数的和是9,则初始化index1=1,index2=length-1=3。此时,分为三种情况:

  1. 若numbers[index1]+numbers[index2]>target,index2--
  2. 若numbers[index1]+numbers[index2]<target,index1++
  3. 相等,则返回

程序代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
	 * 找到两个下标,前提是数组numbers中正好就存在一组这样的解,这种方法只能针对有序表
	 * 
	 * @param numbers数组
	 * @param target目标值
	 * @return返回下标
	 */
	public static int[] twoSum_1(int[] numbers, int target) {
		int result[] = new int[2];// 用于返回最终的下标的数组
		int i = 0;// 第一个下标
		int j = numbers.length - 1;// 第二个下标
		while (i < j) {
			int tmp = numbers[i] + numbers[j];
			if (tmp == target) {
				result[0] = i + 1;
				result[1] = j + 1;
				break;// 跳出循环
			} else if (tmp > target) {
				j--;
			} else {
				i++;
			}
		}
		return result;
	}

时间复杂度为O(n)。

2.2无序数组

   对于无序数组,要找到两个数的下标,这样的对应关系,比较方便的办法是采用Hash表的存储结构,Hash表中的Key为数组中的值为数组中的值,Hash表中的Value的值为数组的index。在Hash表中key的值是不能重复的,若是数组中有相同的数,则会只保存后一个的value,则不影响问题的求解。

程序代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
	 * 找到两个下标,前提是数组numbers中正好就存在一组这样的解
	 * 
	 * @param numbers数组
	 * @param target目标值
	 * @return返回下标
	 */
	public static int[] twoSum_2(int[] numbers, int target) {
		int result[] = new int[2];// 用于返回最终的下标的数组
		int i = 0;
		int j = 0;
		HashMap<Integer, Integer> ht = new HashMap<Integer, Integer>();
		for (int m = 0; m < numbers.length; m++) {
			ht.put(numbers[m], m);
		}
		for (i = 0; i < numbers.length; i++) {
			int tmp = target - numbers[i];
			//存在这样的tmp
			if (ht.containsKey(tmp)) {
				j = ht.get(tmp);
				if (i != j){
					break;
				}else{
					continue;
				}
			}
		}
		//保存好下标
		result[0] = (i<j)?i:j;
		result[1] = i+j-result[0];
		result[0]++;
		result[1]++;
		return result;
	}

时间复杂度为O(n)。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LintCode-56.两数之和
你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。
悠扬前奏
2019/05/31
3300
LeetCode112|两数之和II-输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
码农王同学
2020/10/27
3210
LeetCode - 两数之和②
原题地址:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/
晓痴
2019/09/25
3860
LeetCode - 两数之和②
☆打卡算法☆LeetCode 167. 两数之和 II - 输入有序数组 算法解析
“给定一个整数数组,按照非递减顺序排列,从数组中找出满足相加之和等于目标数的两个数。”
恬静的小魔龙
2022/08/07
2450
☆打卡算法☆LeetCode 167. 两数之和 II - 输入有序数组 算法解析
LeetCode 进阶之路 - 167.两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。 示例: 输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1
Li_XiaoJin
2022/06/10
1940
LeetCode 167:两数之和 II - 输入有序数组 Two Sum II - Input array is sorted
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
爱写bug
2019/07/06
3250
167. Two Sum II - Input array is sorted(双向指针)
Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.
yesr
2019/03/14
3760
017— 两数之和 II - 输入有序数组【LeetCode167】
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
吃猫的鱼Code
2023/08/09
1560
一天一大 leet(两数之和 II - 输入有序数组)难度:简单-Day20200720
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
前端小书童
2020/09/24
2980
一天一大 leet(两数之和 II - 输入有序数组)难度:简单-Day20200720
短小精悍,双指针对撞,求解「两数之和 II」
今天分享的题目来源于 LeetCode 第 167 号问题:两数之和 II - 输入有序数组。
五分钟学算法
2019/11/05
4190
【leetcode系列】167. 两数之和 II - 输入有序数组
假如题目空间复杂度有要求,由于数组是有序的,只需要双指针即可。一个left指针,一个right指针, 如果left + right 值 大于target 则 right左移动, 否则left右移,代码比较简单, 不贴了。
lucifer210
2019/08/16
3820
每天一算:Two Sum II
示例: 输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
五分钟学算法
2018/11/20
5070
【leetcode刷题】T3-Two Sum II
今天本来打算更新3sum closest这道题,但是发现需要用到Two Sum II的思想。
木又AI帮
2019/07/17
4260
【leetcode刷题】T3-Two Sum II
前端算法专栏-数组-167. 两数之和 II - 输入有序数组
很多朋友也是看着这套系列算法拿到很多offer!所以也是想分享给更多朋友,帮助到有需要的朋友。
程序员库里
2023/12/06
1860
LeetCode 167,两数之和2
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
宇宙之一粟
2020/10/26
2790
167. 两数之和 II - 输入有序数组
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。请注意,返回的下标值(index1 和 index2)不是从零开始的。
张伦聪zhangluncong
2022/10/26
2000
你管这破玩意叫“对撞指针”?
本文由一道 leetcode 简单题,引出在刷题和笔试经常用到的双指针中的“对撞指针”解题技巧,供大家参考,希望能对大家有所帮助。
程序员小熊
2021/05/28
3790
你管这破玩意叫“对撞指针”?
167. 两数之和 II - 输入有序数组
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
村雨遥
2020/03/25
2760
两数之和
题意 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。 你需要实现的函数 twoSum 需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 1 到 n,不是以 0 开头。 样例 给出 numbers = [2, 7, 11, 15], target = 9, 返回 [1, 2]。 思路 可以用一个 Map 集合,遍历数组,先记录下当前数与目标数的差值与角标,然后寻找与这个差值相同的数,找到后,将这两个数的角标加 1 后返回即可。 代码实现 public cla
一份执着✘
2018/06/04
6670
两数之和 II – 输入有序数组(Java实现)
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
全栈程序员站长
2022/09/01
4060
相关推荐
LintCode-56.两数之和
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验