坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day2
三数之和
- 题目描述
- 解题思路
- 先有序化数组
- 因为有三个数,所以i遍历到倒数第三个数就好
- 注意去重操作(i,j,k都需要)
- 在i的循环中进行j和k的循环(即固定一个i的情况下转换为双指针问题)
- 注意两个可以优化的点
- 什么时候直接break;什么时候可以continue
- 代码参考
go
func threeSum(nums []int) (ans [][]int) {
//先有序化数组
slices.Sort(nums)
for i := range nums[:len(nums)-2]{
//去重
if i > 0 && nums[i] == nums[i-1]{
continue
}
if nums[i] + nums[i + 1] + nums[i + 2] > 0{
break
}
if nums[i] + nums[len(nums)-2] + nums[len(nums)-1] < 0{
continue
}
j,k := i+1, len(nums)-1
for j < k{
if nums[i] + nums[j] + nums[k] == 0{
ans = append(ans,[]int{nums[i],nums[j],nums[k]})
//比较相等时,也需要同时移动j和k指针来找下一组,此时注意j和k也需要去重操作
for j++; j<k && nums[j]==nums[j-1];j++{}
for k--; k>j && nums[k]==nums[k+1];k--{}
}
if nums[i] + nums[j] + nums[k] < 0{
j++
}
if nums[i] + nums[j] + nums[k] > 0{
k--
}
}
}
return ans
}
- tips
- 数组排序:slices.Sort(nums)(注意slices是第一个字母小写,Sort第一个字母大写)
- 二维数组添加一维数组元素
ans [][]int // 用append添加 ans = append(ans, []int{x, nums[j], nums[k]})
- 数组循环用切片限定循环次数
//注意是前包含后不包含 for i:=range nums[:n-2]{}
- go最后需要有返回值,例如return nil
- 注意必须有j < k这个限定条件
- 在 Go 语言中,分号
;
在for
循环中起到分隔循环的各个部分的作用,它将初始化语句、条件判断、和更新语句 分隔开j, k := i+1, n-1 //注意:上述语句应该写在循环体里面,因为每更新一个i都需要重置
- 注意:双指针的移动也是一个循环的过程