package main
import"fmt"funcmain(){
n :=[]int{2,7,11,15}
t :=9
result :=twoSum(n, t)
fmt.Println("result:", result)}functwoSum(nums []int, target int)[]int{// 1. 首先,函数中创建了一个空的map m,用来存储数组元素和它们的索引。
m :=make(map[int]int)// 2. 然后,通过一个for循环遍历整数数组nums。for i :=0; i <len(nums); i++{// 3. 在循环中,计算出目标值与当前数组元素的差值another。
another := target - nums[i]//4. 检查map m中是否存在这个差值,如果存在,说明找到了两个数的和等于目标值,直接返回这两个数的索引if_, ok := m[another]; ok {return[]int{m[another], i}}//5.如果不存在,将当前数组元素及其索引存入map m中。
m[nums[i]]= i
}// 6. 如果整个数组都遍历完了仍然没有找到符合条件的两个数,最终返回nil。//这个函数的作用是在给定的整数数组中找到两个数,使它们的和等于目标值,然后返回这两个数的索引。returnnil}
threesum
package main
import("fmt""sort")//Given array nums = [-1, 0, 1, 2, -1, -4],//A solution set is://[-1, 0, 1],//[-1, -1, 2]funcmain(){
n :=[]int{-1,0,1,2,-1,-4}
result :=threeSum(n)
fmt.Println(result)}// 这个函数的核心思想是通过排序和双指针的方法,在遍历过程中找到所有满足条件的三元组。// 双指针+排序functhreeSum(nums []int)[][]int{//1. 首先,对输入的整数数组nums进行升序排序。
sort.Ints(nums)//2.创建一个空的二维整数数组result,用来存储符合条件的三元组。
result :=make([][]int,0)//3. 初始化变量start、end、index、addNum,分别表示起始位置、结束位置、当前索引和三个数的和。
start, end, index, addNum :=0,0,0,0
length :=len(nums)// 4.使用for循环遍历数组,从第二个元素开始到倒数第二个元素。for index =1; index < length-1; index++{// 5.在循环中,设置start和end的初始值,并检查当前元素是否与前一个元素相同,如果相同则0 更新start的位置。
start, end =0, length-1if index >1&& nums[index]== nums[index-1]{
start = index -1}// 6.在内部的两个while循环中,不断移动start和end的位置,直到它们相遇。for start < index && end > index {if start >0&& nums[start]== nums[start-1]{
start++continue}// 7.在循环中,检查start和end位置的元素是否与相邻元素相同,如果相同则跳过。if end < length-1&& nums[end]== nums[end+1]{
end--continue}// 8.计算当前三个数的和addNum,如果等于0,则将这三个数加入结果数组中,并更新start和end的位置。
addNum = nums[start]+ nums[end]+ nums[index]if addNum ==0{
result =append(result,[]int{nums[start], nums[index], nums[end]})// 9.如果addNum大于0,则将end向左移动;如果addNum小于0,则将start向右移动。
start++
end--}elseif addNum >0{
end--}else{
start++}}}// 最终返回存储了所有符合条件的三元组的结果数组result。return result
}