有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。—鲁迅
- 最简单的方法是暴力枚举,正可谓任题千变万化,我自n for走天下。
private static int[] twoSum(int[] nums, int target) {
int length = nums.length;
for (int i = 0; i < length; i++) {
int num = target - nums[i];
for (int j = i + 1; j < length; j++) {
if (nums[j] == num) {
return new int[]{i, j};
}
}
}
return new int[0];
}
- 搞点高级的,借助计数排序的部分思想,咱们利用一下hashmap这个能存键值的数据结构,每次判断一下是不是有那个key就行了吗,有就直接返回存在value里的index。
代码如下:
private static int[] twoSum(int[] nums, int target) {
int length = nums.length;
Map<Integer, Integer> hashtable = new HashMap<>();
for (int i = 0; i < length; ++i) {
if (hashtable.containsKey(target - nums[i])) {
return new int[]{hashtable.get(target - nums[i]), i};
}
hashtable.put(nums[i], i);
}
return new int[0];
}
其实这题解法也就这俩,扩展两个直接返回是哪两个数相加的解法,我才不会说刚开始看错题了。。
- 排序数组后利用二分查找思想找到这两个相加的数
代码如下:
public static int[] twoSum(int[] nums, int target) {
Arrays.sort(nums);
int left = 0;
int right = nums.length - 1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum == target) {
return new int[]{nums[left], nums[right]};
} else if (sum < target) {
left++;
} else {
right--;
}
}
return new int[0];
}
- 直接借用计数排序的思想,构建计数数组进行查找。
public static int[] twoSum(int[] nums, int target) {
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for (int num : nums) {
min = Math.min(min, num);
max = Math.max(max, num);
}
int[] bucket = new int[max - min + 1];
for (int num : nums) {
bucket[num - min]++;
}
int[] result = new int[2];
for (int i = 0; i < bucket.length; i++) {
if (bucket[i] > 0) {
if (target - i - min > 0 && target - i > i && bucket[target - i - 2 * min] > 0) {
result[0] = i + min;
result[1] = target - i - min;
return result;
}
}
}
return result;
}