Question:
My code:
import java.util.Arrays;
import java.util.HashMap;
public class Solution {
public int threeSumClosest(int[] nums, int target) {
if (nums == null || nums.length < 3)
return 0;
Arrays.sort(nums);
int minX = Integer.MAX_VALUE;
int min = 0;
HashMap<Integer, Integer> h = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length - 2; i++) {
int findResult = target - nums[i];
if (h.containsKey(findResult))
continue;
else
h.put(findResult, nums[i]);
int start = i + 1;
int end = nums.length - 1;
while ((i == 0 || nums[i] != nums[i - 1]) && start < end) {
if (minX > Math.abs(nums[start] + nums[end] - findResult)) {
minX = Math.abs(nums[start] + nums[end] - findResult);
min = nums[start] + nums[end] + nums[i];
}
if (nums[start] + nums[end] > findResult) {
end--;
while (start < end && nums[end] == nums[end + 1])
end--;
}
else if (nums[start] + nums[end] < findResult) {
start++;
while (start < end && nums[start] == nums[start - 1])
start++;
}
else {
return target;
}
}
}
return min;
}
public static void main(String[] args) {
Solution test = new Solution();
int[] a = {1, 1, 1, 0};
System.out.println(test.threeSumClosest(a, -100));
}
}
My test result:
和昨天的题目差不多,3Sum.
只不过这个不是找三个数等于0,而是找三个数最接近target。
那么,就是找 nums[start] + nums[end] 最接近 target - nums[i].
并且可以每次都把target - nums[i] 存入哈希表, 遍历之前,先看下哈希表有没有这个值。如果有的话,说明距离这个值最近的所有情况都已经找过了,不需要再找了。直接continue结束这次循环。
**
总结:没什么好总结的。做这道题目的时候人比较暴躁,刚跟女朋友吵完架。
只是生气,为什么什么事情都是那么的犹豫不确定,然后别人一催,还要发火。
托福也是,该不该退考。
出国也是,昨天突然又冒出来什么Plan B。加拿大,日本。
这次旅游也是。昨天和我说她爸默认允许了。我今天还高兴地和我爸说来着。结果,中午她又改口,说不确定她爸的态度,然后进一步问,她又说不知道,不要再逼她了,她要考试。
我真的感觉自己快受够了。
我的确爱她,但现在我发现,就算爱,两个人也不一定合适。她身上有太多我所讨厌的习惯了,不是生活习惯,是精神习惯。
我和她能走多远?我不知道。
我只知道,结束的那一刻,我一定不会再有2015年五月那次那么伤心了。
少年,先谈自爱,再说他爱。
**
Anyway, Good luck, Richardo!
import java.util.Arrays;
public class Solution {
public int threeSumClosest(int[] nums, int target) {
if (nums == null || nums.length < 3)
return 0;
Arrays.sort(nums);
int minSum = 0;
int closest = Integer.MAX_VALUE;
for (int i = 0; i < nums.length; i++) {
if (i >= 1 && nums[i] == nums[i - 1])
continue;
int find = target - nums[i];
int start = i + 1;
int end = nums.length - 1;
while (start < end) {
int diff = find - nums[start] - nums[end];
if (Math.abs(diff) < closest) {
closest = Math.abs(diff);
minSum = target - diff;
}
if (diff == 0)
break;
else if (diff > 0)
start++;
else
end--;
}
}
return minSum;
}
public static void main(String[] args) {
Solution test = new Solution();
int[] nums = new int[]{-1, 2, 1, -4};
System.out.println(test.threeSumClosest(nums, 1));
}
}
要用什么哈希啊。。。并不需要。
感觉思路更加清晰了。
再强调一次!
写代码的时候,尽量少用多个逻辑再加上与或的判断。会让代码的可读性大大降低!
比如老版本中的,
while ((i == 0 || nums[i] != nums[i - 1]) && start < end) {
What a fuck!
Anyway, Good luck, Richardo!