首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >定一个已按升序排列的数组,找出两个数使它们相加之和等于目标数

定一个已按升序排列的数组,找出两个数使它们相加之和等于目标数

作者头像
编码如写诗
发布2026-03-02 20:51:30
发布2026-03-02 20:51:30
610
举报
文章被收录于专栏:编码如写诗编码如写诗

算法题

聊回技术。

今天这道题,是我在刷LeetCode时看到的。题目叫"两数之和 II",给定一个已按升序排列的数组,找出两个数使它们相加之和等于目标数。

为啥选这道题?

因为看到大家讨论"点奶茶选口味",我突然想到——这不就是一个选择匹配的问题吗?

AI问你"要几分糖、几分冰",本质上也是在数组里找到合适的组合。


题目理解

给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标数。

函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

注意:返回的下标值不是从零开始的,而是从1开始。

示例

代码语言:javascript
复制
输入: numbers = [2,7,11,15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9。因此 index1 = 1, index2 = 2。

思路分析

暴力解法:两层循环遍历所有可能的组合,时间复杂度O(n²)。

但数组是有序的,这个条件很关键,我们可以利用它来优化。

双指针解法

  • 左指针指向数组开头(最小值)
  • 右指针指向数组末尾(最大值)
  • 计算两数之和:
    • 如果等于target,返回结果
    • 如果小于target,左指针右移(需要更大的数)
    • 如果大于target,右指针左移(需要更小的数)

这样只需要遍历一遍,时间复杂度O(n)。


复杂度分析

  • 时间复杂度:O(n),最坏情况下遍历整个数组
  • 空间复杂度:O(1),只使用了两个指针

代码实现

代码语言:javascript
复制
package main

import (
 "fmt"
)

// twoSum 双指针解法
func twoSum(numbers []int, target int) []int {
 left, right := 0, len(numbers)-1
 
 for left < right {
  sum := numbers[left] + numbers[right]
  
  if sum == target {
   // 题目要求下标从1开始
   return []int{left + 1, right + 1}
  } else if sum < target {
   // 和太小,左指针右移,需要更大的数
   left++
  } else {
   // 和太大,右指针左移,需要更小的数
   right--
  }
 }
 
 // 根据题意,一定存在解
 return []int{-1, -1}
}

func main() {
 // 测试用例1
 numbers1 := []int{2, 7, 11, 15}
 target1 := 9
 fmt.Printf("输入: numbers = %v, target = %d\n", numbers1, target1)
 fmt.Printf("输出: %v\n\n", twoSum(numbers1, target1))
 // 预期输出: [1, 2]
 
 // 测试用例2
 numbers2 := []int{2, 3, 4}
 target2 := 6
 fmt.Printf("输入: numbers = %v, target = %d\n", numbers2, target2)
 fmt.Printf("输出: %v\n\n", twoSum(numbers2, target2))
 // 预期输出: [1, 3]
 
 // 测试用例3:包含负数
 numbers3 := []int{-1, 0}
 target3 := -1
 fmt.Printf("输入: numbers = %v, target = %d\n", numbers3, target3)
 fmt.Printf("输出: %v\n", twoSum(numbers3, target3))
 // 预期输出: [1, 2]
}

注意事项

  • 下标从1开始:LeetCode有些题目要求返回的下标从1开始,读题时要注意
  • 数组已排序:这个条件是使用双指针的前提,如果数组无序,需要先排序(O(nlogn))或者使用哈希表(O(n)空间)
  • 唯一解:本题保证有且仅有一个答案
  • 不能重复使用元素:同一个元素不能使用两次,所以循环条件是 left < right 而不是 left <= right
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-02-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编码如写诗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目理解
  • 思路分析
  • 复杂度分析
  • 代码实现
  • 注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档