巩义自助建站优化,电子商务的发展现状和前景趋势,网站开发所需要的技术,dede网站安全设置防挂马教程167. 两数之和 II - 输入有序数组
题干
给你一个下标从 1 开始的整数数组 numbers #xff0c;该数组已按 ** 非递减顺序排列 **#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[2] #xff0c;则 …167. 两数之和 II - 输入有序数组
题干
给你一个下标从 1 开始的整数数组 numbers 该数组已按 ** 非递减顺序排列 **请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[2] 则 1 index1 index2 numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
示例 1
输入numbers [2,7,11,15], target 9
输出[1,2]
解释2 与 7 之和等于目标数 9 。因此 index1 1, index2 2 。返回 [1, 2] 。
示例 2
输入numbers [2,3,4], target 6
输出[1,3]
解释2 与 4 之和等于目标数 6 。因此 index1 1, index2 3 。返回 [1, 3] 。
示例 3
输入numbers [-1,0], target -1
输出[1,2]
解释-1 与 0 之和等于目标数 -1 。因此 index1 1, index2 2 。返回 [1, 2] 。提示
2 numbers.length 3 * 10sup4/sup-1000 numbers[i] 1000numbers 按 非递减顺序 排列-1000 target 1000仅存在一个有效答案
题解
这个问题是典型的 “Two Sum” 问题的一个变体但这里的数组已经是有序的。由于数组是有序的我们可以使用双指针方法来找到两个数的和等于目标值 target。
下面是算法的步骤 初始化两个指针left 指向数组的开始索引 1right 指向数组的结束索引 numbers.size()。 进行循环直到 left 和 right 相遇 计算 numbers[left] 和 numbers[right] 的和。如果和等于 target返回 {left 1, right 1}因为题目中的索引是从 1 开始的。如果和小于 target增加 left 指针以增加总和。如果和大于 target减少 right 指针以减少总和。 如果找不到这样的两个数返回空数组或者任意不可能的索引组合根据题目要求。
以下是该算法的 C 实现
vectorint twoSum(vectorint numbers, int target) {int left 0, right numbers.size() - 1;while (left right) {int sum numbers[left] numbers[right];if (sum target) {return {left 1, right 1};} else if (sum target) {left;} else {--right;}}return {}; // 没有找到解
}复杂度分析
时间复杂度O(n)其中 n 是数组 numbers 的长度。最坏的情况下left 和 right 指针各遍历整个数组一次。空间复杂度O(1)只使用了常数级别的额外空间。