题目:两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题思路:
1.首先想到的是暴力破解,两层循环数组,判断和是否为target。
2.改进,想到用哈希数组,循环两次进行处理,最后再修改成一次。
代码如下:
private int [] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(4);
int [] sort = new int[2];
for (int i = 0, j = nums.length; i < j; i++) {
int k = target - nums[i];
if (map.get(k) != null) {
sort[0] = i;
sort[1] = map.get(k);
return sort;
}
map.put(nums[i], i);
}
return null;
}
不足:
1.第一次使用leetCode训练算法题,选择的是简单的题,虽然解决了,但是使用的时间还是太久,导致踩了很多坑,比如用key来存储下标,value存储值 等等。
2.对数组和集合的使用不够熟练。
3.代码中有可以改进点,例如返回可以改成
return new int [] {map.get(k), i};
学习:
学习运行时间最短的代码
class Solution {
int size = 2048;
int[] map = new int[size];
int length = 2047;
int index;
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
index = nums[i]&length;
if (map[index] != 0) {
return new int[] { map[index] - 1, i };
} else {
map[(target - index)&length ] = i + 1;
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
总结
第一次提交代码,好有成就感,哈哈。还要继续练习,坚持下去,加油!!!