62,614
社区成员
发帖
与我相关
我的任务
分享
class Solution {
public int[] twoSum(int[] nums, int target) {
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for (int num : nums) {
if (num < min) {
min = num;
}
if (num > max) {
max = num;
}
}
int validMin = Math.max(min, target - max);
int validMax = Math.min(max, target - min);
int length = validMax - validMin + 1;
int[] array = new int[length];
int offset = validMin;
Arrays.fill(array, -1);
for(int i = 0 ; i != nums.length ; ++i) {
int num = nums[i];
if (num >= validMin && num <= validMax) {
int firstIndex = array[num - offset];
if (firstIndex == -1) {
int diff = target - num;
array[diff - offset] = i;
} else {
return new int[]{firstIndex, i};
}
}
}
throw null;
}
}
public class Solution {
public int[] twoSum(int[] nums, int target) {
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int[] out = new int[2];
for (int i : nums) {
if (i > max) max = i;
if (i < min) min = i;
}
int length = max - min + 1;
int[] array = new int[length];
for (int i : nums) {
array[i - min]++;
}
target = target - 2 * min;
for (int i = 0; i <= target; i++) {
if (target - i >= length) continue;
if (array[i]-- > 0 && array[target - i]-- > 0) {
for (int j = 0; j < nums.length; j++) {
if (nums[j] == i + min) {
nums[j] = target -i + min - 1;
out[0] = j;
break;
}
}
for (int j = 0; j < nums.length; j++) {
if (nums[j] ==target - i + min) {
out[1] = j;
break;
}
}
break;
}
}
return out;
}
}
看得脑袋痛。。。不知道别人怎么想出这个算法来的。。。
public int[] twoSum(int[] nums, int target) {
int[] res = new int[2];
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int diff = target - nums[i];
if (map.containsKey(diff)) {
res[0] = map.get(diff);
res[1] = i;
return res;
}
map.put(nums[i], i);
}
return res;
}
从map中查找结果,map的get速度很快,最长时间也就是把整个数组过一遍,比逐个相加快了很多。
这些我都可以理解,但是,3ms这个答案,我实在是不知道怎么想才能想到这个办法
class Solution {
public int[] twoSum(int[] nums, int target) {
// 初始化最小的数是 int 最大值,这样就能确定数组里每个数都小于min
int min = Integer.MAX_VALUE;
// 初始化最大的数是 int 最小值,这样就能确定数组里每个数都大于max
int max = Integer.MIN_VALUE;
for (int num : nums) {
//找到数组里最大的数
if (num < min) {
min = num;
}
//找到数组里最小的数
if (num > max) {
max = num;
}
}
// 找到数组里组成target 数值的下限
int validMin = Math.max(min, target - max);
// 找到数组里组成 target 数值的上限
int validMax = Math.min(max, target - min);
// 计算上限和下限之间的差值
int length = validMax - validMin + 1;
int[] array = new int[length];
int offset = validMin;
Arrays.fill(array, -1);
// 遍历原始的数组
// 寻找 num = diff
for(int i = 0 ; i != nums.length ; ++i) {
int num = nums[i];
// 过滤走原始数组里不符合上限和下限的元素
if (num >= validMin && num <= validMax) {
// 检查 num - offset 得结果是不是第一次出现在数组里
// 如果是第一次出现,数组对应的数值就是 - 1
int firstIndex = array[num - offset];
// 如果是第一次出现
if (firstIndex == -1) {
// 计算目标和目前数字的差
int diff = target - num;
// 用另一个加数的值减去offset作为数组的下标,并保存另一个加数在原始数组里的下标
array[diff - offset] = i;
} else {
// 如果num - offset 出现过,也就是加数的另一个数已经在原始数组里遍历过了
// 那就返回储存的值和现在这个数在原始数组里的下标值
return new int[]{firstIndex, i};
}
}
}
throw null;
}