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.
只不過(guò)這個(gè)不是找三個(gè)數(shù)等于0宣蔚,而是找三個(gè)數(shù)最接近target。
那么认境,就是找 nums[start] + nums[end] 最接近 target - nums[i].
并且可以每次都把target - nums[i] 存入哈希表胚委, 遍歷之前,先看下哈希表有沒(méi)有這個(gè)值叉信。如果有的話亩冬,說(shuō)明距離這個(gè)值最近的所有情況都已經(jīng)找過(guò)了,不需要再找了茉盏。直接continue結(jié)束這次循環(huán)鉴未。
**
總結(jié):沒(méi)什么好總結(jié)的。做這道題目的時(shí)候人比較暴躁鸠姨,剛跟女朋友吵完架铜秆。
只是生氣,為什么什么事情都是那么的猶豫不確定讶迁,然后別人一催连茧,還要發(fā)火。
托福也是,該不該退考啸驯。
出國(guó)也是客扎,昨天突然又冒出來(lái)什么Plan B。加拿大罚斗,日本徙鱼。
這次旅游也是。昨天和我說(shuō)她爸默認(rèn)允許了针姿。我今天還高興地和我爸說(shuō)來(lái)著袱吆。結(jié)果,中午她又改口距淫,說(shuō)不確定她爸的態(tài)度绞绒,然后進(jìn)一步問(wèn),她又說(shuō)不知道榕暇,不要再逼她了蓬衡,她要考試。
我真的感覺(jué)自己快受夠了彤枢。
我的確愛(ài)她狰晚,但現(xiàn)在我發(fā)現(xiàn),就算愛(ài)缴啡,兩個(gè)人也不一定合適家肯。她身上有太多我所討厭的習(xí)慣了,不是生活習(xí)慣盟猖,是精神習(xí)慣。
我和她能走多遠(yuǎn)换棚?我不知道式镐。
我只知道,結(jié)束的那一刻固蚤,我一定不會(huì)再有2015年五月那次那么傷心了娘汞。
少年,先談自愛(ài)夕玩,再說(shuō)他愛(ài)你弦。
**
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));
}
}
要用什么哈希啊。燎孟。。并不需要。
感覺(jué)思路更加清晰了建芙。
再?gòu)?qiáng)調(diào)一次速缆!
寫代碼的時(shí)候,盡量少用多個(gè)邏輯再加上與或的判斷。會(huì)讓代碼的可讀性大大降低萍程!
比如老版本中的幢妄,
while ((i == 0 || nums[i] != nums[i - 1]) && start < end) {
What a fuck!
Anyway, Good luck, Richardo!