[LeetCode][1]Two Sum解析 -Java实现

原创 2016年06月01日 16:23:30

Q:

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.

A:

以下解法和代码没有借阅以往任何资料,如果有更好的解法请在评论区留言

题目的意思是给一个数组,给一个特殊的数字,返回数组中相加等于目标数字的两个索引,你可以假设每一个特殊数字都是单解。

public class TwoSum {
	public static int[] twoSum(int[] array,int target){
		for(int i=0;i<array.length;i++){
			for(int j = 0;j<array.length-i;j++){
				if((array[i]+array[j])==target)
					return new int[]{array[i],array[j]};
			}
		}
		return null;
	}
	public static void main(String[] args){
		int[] array = new int[]{1,2,3,4,5,6,7,8,9};
		int[] indices = TwoSum.twoSum(array, 5);
		if(indices!=null){
			System.out.println(indices[0]+"    "+indices[1]);
		}
	}
}
这是基础解答,一般人第一反应应该都是这样,这种方法遍历两次代价太高,我们可以具体解析一下看看有没有更加便捷的解决方法。

只要我们取出array中的max和min,去掉array中大于target-min和小于target-max的数值,这样可以缩减范围,生成newarray。

那么接下来我们只需要对有序序列newarray中的头尾相加,如果大于target则把尾值去掉,如果小于target则把头值去掉,这样可以把两次循环O(n^2)化为O(2n)约等于O(n)

但是,这时候我们发现排序算法是O(n^2)的,所以这种解法就无解了。

另一种情况,我们把target的所有情况列出来一共有floor(target/2)种,我们只要维护这样一个数组targetArray[0-target]只要targetArray[i]>=1且targetArray[target-i]>=1即可返回。(假设array中没有负数)

代码如下

	public static int[] newTwoSum(int[] array,int target){
		int[] targetArray = new int[target+1];
		for(int i :array){
			if(i>=0&&i<=target){
				targetArray[i]++;
				if(targetArray[target-i]>=1){
					return new int[]{i,target-i};
				}
			}
		}
		return null;
	}


版权声明:本文为博主原创文章,未经博主允许不得转载。

leetcode 1. Two Sum -----java

题目链接:https://leetcode.com/problems/two-sum/ 题目: Given an array of integers, return indices of th...
  • j754379117
  • j754379117
  • 2016年06月20日 19:52
  • 1412

【LeetCode-面试算法经典-Java实现】【001-Two Sum(求两个数的和)】

给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字。要求:这个函数twoSum必须要返回能够相加等于目标数字的两个数的索引,且index1必须要小于index2。请注意一点,你返回的结果(包...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月16日 06:39
  • 8234

LeetCode【1】. Two Sum--java的不同方法实现

LeetCode         最近才知道有这么好的平台可以刷题,真是惭愧惭愧。现在开始,努力,一道道地刷题!...
  • waycaiqi
  • waycaiqi
  • 2015年05月22日 01:12
  • 3188

lintcode 两数之和(Two Sum )(Java)

题目 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 1 到...
  • C_calary
  • C_calary
  • 2017年07月13日 14:16
  • 998

[LeetCode] 001. Two Sum (Medium) (C++/Java/Python)

001.Two_Sum (Medium)
  • hcbbt
  • hcbbt
  • 2015年02月27日 12:28
  • 8989

LeetCode: Two Sum (Java)

最近G家的HR联系的紧,也不好意思一直拖着,再加上现在在EA干的活没啥意思,能跳的话也好,所以再一次开始刷题了,只是,之前用c++,现在要用java了。。。哎,编程语言来来回回的变啊。。。 废话不说...
  • sunjilong
  • sunjilong
  • 2013年12月06日 13:43
  • 2885

LeetCode 1 — Two Sum(C++ Java Python)

题目: Given an array of integers, find two numbers such that they add up to a specific target number. ...
  • dragon_dream
  • dragon_dream
  • 2014年02月16日 22:23
  • 15273

LeetCode01:Two Sum Java实现

原题目: Given an array of integers, return indices of the two numbers such that they add up to a speci...
  • gg543012991
  • gg543012991
  • 2016年11月16日 22:03
  • 136

LeetCode题解--1. Two Sum(和为S的两个数字)

题目地址https://leetcode.com/problems/two-sum/ 描述给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字。要求:这个函数twoSum必须要返回能够相加等于...
  • gatieme
  • gatieme
  • 2016年01月27日 22:32
  • 4616

Two Sum -- LeetCode

原题链接: http://oj.leetcode.com/problems/two-sum/ 这是一道非常经典的题目,brute force时间复杂度为O(n^2), 对每一对pair两两比较。 优...
  • linhuanmars
  • linhuanmars
  • 2014年02月22日 23:11
  • 20518
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[LeetCode][1]Two Sum解析 -Java实现
举报原因:
原因补充:

(最多只允许输入30个字)