(leetcode)1. 查找数组中两个数之和为给定值Two Sum---Java
2017-04-23 11:07
465 查看
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.
给定一个整数数组,返回两个数字的索引,使得它们相加到一个特定的目标。
您可以假设每个输入都有一个解决方案。
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
我的解法:思路是把数组装进arraylist列表里面,然后做一次循环,每次用列表里面的第i个数和后面的第n-i个数做判断。这样做没有最快的答案好,但是思路是一样的,原因在于,
我是先一次性全部放进去,这里花时间。然后,每次比较,我又取了全部list的子列表arraylist,这里也花时间。
public
int[] twoSum(int[]
nums,
int
target) {
List<Integer>s
=
new
ArrayList<Integer>();
int
len
=
nums.length;
for(int
i=0;i<len;i++){
[align=left] s.add(nums[i]);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] //Collections.sort(s);[/align]
[align=left] [/align]
for(int
i=0;i<len-1;i++){
// System.out.println(i+" i " +
len+ "
len");
// System.out.println(s.subList(i+1,
len)+" "+(target-nums[i]));
if(s.subList(i+1,
len).contains(target-nums[i])){
int[]res
=
new
int[2];
res[0]
=
i;
res[1]
= 1+i+s.subList(i+1,
len).indexOf(target-nums[i]);
return
res;
[align=left] }[/align]
[align=left] }[/align]
return
null;
}
标准算法:
[align=left] [/align]
[align=left] [/align]
public
int[] twoSum2(int[]
numbers,
int
target) {
int[]
result
=
new
int[2];
Map<Integer, Integer>
map
=
new
HashMap<Integer, Integer>();
for
(int
i
= 0;
i
<
numbers.length;
i++) {
if
(map.containsKey(target
-
numbers[i]))
{
result[1] =
i
;
result[0] =
map.get(target
-
numbers[i]);
return
result;
[align=left] }[/align]
map.put(numbers[i],
i
);
[align=left] }[/align]
return
result;
}
放在hashmap里面,这样,在找到值的时候,去找对应的键就很快,比arraylist中的indexof要快,
另外,采用倒叙的方式,每次比较,比不到就加一个,加一个比截取一大段复杂度要低很多。
You may assume that each input would have exactly one solution.
给定一个整数数组,返回两个数字的索引,使得它们相加到一个特定的目标。
您可以假设每个输入都有一个解决方案。
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
我的解法:思路是把数组装进arraylist列表里面,然后做一次循环,每次用列表里面的第i个数和后面的第n-i个数做判断。这样做没有最快的答案好,但是思路是一样的,原因在于,
我是先一次性全部放进去,这里花时间。然后,每次比较,我又取了全部list的子列表arraylist,这里也花时间。
public
int[] twoSum(int[]
nums,
int
target) {
List<Integer>s
=
new
ArrayList<Integer>();
int
len
=
nums.length;
for(int
i=0;i<len;i++){
[align=left] s.add(nums[i]);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] //Collections.sort(s);[/align]
[align=left] [/align]
for(int
i=0;i<len-1;i++){
// System.out.println(i+" i " +
len+ "
len");
// System.out.println(s.subList(i+1,
len)+" "+(target-nums[i]));
if(s.subList(i+1,
len).contains(target-nums[i])){
int[]res
=
new
int[2];
res[0]
=
i;
res[1]
= 1+i+s.subList(i+1,
len).indexOf(target-nums[i]);
return
res;
[align=left] }[/align]
[align=left] }[/align]
return
null;
}
标准算法:
[align=left] [/align]
[align=left] [/align]
public
int[] twoSum2(int[]
numbers,
int
target) {
int[]
result
=
new
int[2];
Map<Integer, Integer>
map
=
new
HashMap<Integer, Integer>();
for
(int
i
= 0;
i
<
numbers.length;
i++) {
if
(map.containsKey(target
-
numbers[i]))
{
result[1] =
i
;
result[0] =
map.get(target
-
numbers[i]);
return
result;
[align=left] }[/align]
map.put(numbers[i],
i
);
[align=left] }[/align]
return
result;
}
放在hashmap里面,这样,在找到值的时候,去找对应的键就很快,比arraylist中的indexof要快,
另外,采用倒叙的方式,每次比较,比不到就加一个,加一个比截取一大段复杂度要低很多。
相关文章推荐
- leetcode:java.T018_4Sum---给定一个整数数组,找出a + b + c + d = target的唯一解,不能有重复元素组
- 【LeetCode-面试算法经典-Java实现】【001-Two Sum(求两个数的和)】
- leetcode-java.T016_threeSumClosest---给定包含n个整数数组S,找到S中的三个整数,从而使之和最接近给定的数,返回三个整数的总和.
- leetcode 1 Two Sum(在无序数组中找两个数之和与目标值相等,两种方法)
- leetcode-java.T001_TwoSum 给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字
- leetcode 1 Two Sum(在无序数组中找两个数之和与目标值相等)
- 在给定数组中查找两个数的和为给定值sum
- 【leetcode】Two Sum II - Input array is sorted(输入有序的数组,求两个数的和)
- 167 Two Sum II (给定数组求相加为定值的两个数)
- 程序员面试题100题第10题——在排序数组中查找和为给定值的两个数
- LeetCode – Two Sum (Java)
- LeetCode 1 Two sum Java
- LeetCode 1 Two Sum for java
- LeetCode1 TwoSum Java
- 【Leetcode】two sum JAVA
- LeetCode 001_Two Sum Java
- 给定一个数组,从中查找是否存在两个数的和等于一个给定的x
- LeetCode 1: Two Sum (JAVA)
- [Leetcode] Two Sum (Java)
- LeetCode(001) Two Sum (Java)