LeetCode记录之——3Sum Closest

这道题和上一题有点类似,只要改动一点就好了——我当初是这么想的

后来发现改好的代码是差不多,可改动的地方全是逻辑上容易忽略的点啊,全是一点点从运行错误中改过来的有木有,真是自己把自己给坑了。

重点就是那个里层while的用法,这个是用来减少重复数字对的检测的,但是稍有不注意就有可能将num[p] = num[q]的情况给略过去,所以用的时候要谨慎又谨慎。刚开始没注意到这个,被坑了好久,而且这个while一开始是在else里面的,也没注意到,所以被坑了两次,后来我直接给去掉了,但是应该是有方法加上去的,以后再试试看。

对对,还有一个重要问题,就是如果将一个变量初始化为Math.MaxValue,就绝对不能参加运算了!只能进行比较,否则就会溢出,然后就是匪夷所思的错误了。

public class Solution {
    public int find2(int[] num, int start, int key){
			int res = 9999; // 由于后面要参加运算,就不能初始化为Math.MaxValue了,但是感觉还是Math.MaxValue靠谱一点,以后尽量改逻辑来用Math.MaxValue
			int p = start;
			int q = num.length - 1 ;
			while(p < q){
				res = Math.abs(key - num[p] - num[q]) > Math.abs(key - res)? res : num[p] + num[q];
				if(num[p] + num[q] < key){ p++; }
				else if(num[p] + num[q] > key){ q--; }
				else{res = num[p++] + num[q--];}  // 赋值语句有点多余,但是 p++ 和 q-- 是绝对不能省的!又是自己的逻辑漏洞
				
			}
			return res;
		}
		public int threeSumClosest(int[] num, int target) {
			int result = 9999;
			Arrays.sort(num);
			int len = num.length;
			for(int i = 0; i < len - 2; i++){
				int resI = find2(num, i+1, target-num[i]);
				resI = resI + num[i];
				result = Math.abs(result - target) > Math.abs(resI - target)? resI : result;
				while(i + 1 < len && num[i] == num[i+1])
				{i++;}
			}
			return result;
		}
}


你可能感兴趣的:(LeetCode)