数据结构与算法数组两题two_sum和three_sum写好详细注释

two sum

package main

import "fmt"

func main() {
	n := []int{2, 7, 11, 15}
	t := 9
	result := twoSum(n, t)
	fmt.Println("result:", result)
}

func twoSum(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。
	//这个函数的作用是在给定的整数数组中找到两个数,使它们的和等于目标值,然后返回这两个数的索引。
	return nil
}

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]

func main() {
	n := []int{-1, 0, 1, 2, -1, -4}
	result := threeSum(n)
	fmt.Println(result)
}

// 这个函数的核心思想是通过排序和双指针的方法,在遍历过程中找到所有满足条件的三元组。
// 双指针+排序
func threeSum(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-1
		if 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--
			} else if addNum > 0 {
				end--
			} else {
				start++
			}
		}
	}
	// 最终返回存储了所有符合条件的三元组的结果数组result。
	return result
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值