1、题目如下:
2、个人Python代码实现:
以上图为例,第一次实现未考虑数组nums存在重复元素,导致输出的数组里面的元素数组可能存在排序后相同的元素。于是做了去重:
由上图第8行代码可知,数组set以后无法使用下标,而且先把nums数组去重本身就是错误的思路,应该是满足三数之和等于零时,将符合的数组进行去重:
这里能发现,当数组元素足够多,也是会超时的,这里需要进行算法优化。
以上代码算是照抄大佬的,个人理解后作以下注释:
首先题目求三数之和,可以转换为将数组升序排序后,选定一个值nums[i]和2个指针(nums[L]、nums[R])求和等于0。当三数之和小于0时,意味着左指针(nums[L])值过小,需要将左指针右移;当三数之和大于0时,意味着右指针(nums[R])过大,需要将右指针左移。这里存在一个难点,就是如果当前选定的值,与他前后相邻的元素相同,则返回的数组中可能存在重复的数组。
按照个人理解,去除大佬做的去重处理,再加入数组res时判断是否存在该元素(第17行代码),实现代码如下:
可以看到因为加了一次判断,内存资源消耗没有差距,但是执行耗时大幅上升。
3、个人Java代码实现,由于代码提示List不能作为一个Type,不确定是否本地JDK版本过低,还是其他原因,本题暂时不使用Java,如果使用,实际上与Python实现方式基本一致。