思路
不知道是不是用kotlin提交的人少呀,内存和时间又击败了100%的用户,哈哈哈。思路也是借鉴的网上的。
先排序,排好后遍历。怎么遍历呢,若一个数小于等于0,则使用双指针法对数组位于这个数前面的部分扫描一遍,找到符合的三元组加入结果;大于0直接结束就可以了,因为这个数之后都是正数,不会存在三个数加起来等于0。
为了防止重复,我使用了一个数据类来存储三元组,覆写了equal和hashcode方法,用一个set存储结果集。
代码
data class Three(val x: Int,val y: Int,val z: Int){override fun equals(other: Any?): Boolean {if (this === other) return trueif (javaClass != other?.javaClass) return falseother as Threeif (x != other.x) return falseif (y != other.y) return falseif (z != other.z) return falsereturn true}override fun hashCode(): Int {var result = xresult = 31 * result + yresult = 31 * result + zreturn result}}class Solution {fun threeSum(nums: IntArray): List<List<Int>> {val result = mutableListOf<List<Int>>()val resultSet = mutableSetOf<Three>()nums.sort()for (i in 0 until nums.size - 2) {if (nums[i] > 0) breakvar pLeft = i + 1var pRight = nums.size - 1while (pLeft < pRight) {val sum = nums[i] + nums[pLeft] + nums[pRight]if (sum == 0) {val three = Three(nums[i], nums[pLeft], nums[pRight])if (!resultSet.contains(three)) {result.add(listOf(nums[i], nums[pLeft], nums[pRight]))resultSet.add(three)}pRight--pLeft++}else if (sum > 0) {pRight--}else{pLeft++}}}return result}}
