Leetcode 系列 —— 《15. 三数之和》

135 阅读1分钟

链接:

leetcode-cn.com/problems/3s…

思路

/*
* 思路:
* 1. 先排序,然后再遍历数组,以 i 为第一个基准点
* 2. i < nums.length - 2,因为 1 2 3 4,假如为 2 为基点的时候,那么 肯定后面只可能是 3 4,不然就凑不够 3 个数字
* 3. 比如基点为 1 的时候,双指针分别指向 2 和 4,不断收缩,假如 基点 + 指针 start + 指针 end < 0 ,那么就代表需要一个
* 更大的数,那么就是 start ++, 反而就是 end --,假如已经和为 0 ,那么推入结果数组中,start ++, end --;
* 4. 在拿到结果之后,需要做去重,比如 -5222333,第一次拿到 [-5, 2, 3],那么假如 start ++ end -- 之后,还是 -5 , 2 ,3
* 那么就需要做去重了,所以需要 start 一直 ++ 和 end 一直 --,直到上一个 start 不等于 下一个 start,end 亦然;
* 5. 在 i 本次遍历完之后,进入到下一个 i,那么就需要判断这个 i 和上一个 i 的值是不是一样,因为假如是一样的话,比如 -1, -1, 1, 0
* 那么就会有重复的 -1, 1, 0 两个结果,所以也要判断前后两个 i 的值是不是一样的,是的话跳过本次循环
* */

var threeSum = function(nums) {
	if (nums.length < 3) return [];
	let ret = [];
	nums.sort((a, b) => a - b);

	for (let i = 0; i < nums.length - 2; i++) {
	  let start = i + 1;
	  let end = nums.length - 1;
	  if (i > 0 && nums[i] === nums[i - 1]) continue;
	  while (start < end) {
	  	if (nums[i] + nums[start] + nums[end] < 0) {
	  		start ++;
		  } else if (nums[i] + nums[start] + nums[end] > 0) {
	  		end --;
		  } else {
	  		ret.push([nums[i], nums[start], nums[end]]);
	  		start ++;
	  		end --;
	  		while (start < end && nums[start] === nums[start - 1]) start ++;
			  while (start < end && nums[end] === nums[end + 1]) end --;
		  }
	  }
	}
	return ret;
};

console.log(threeSum([-1,0,1,2,-1,-4]))