题目分析:题目所给的数据为有序值,从小到大,所以尽可能的避免使用暴力来运算,两个for循环嵌套将达到O(n^2)的时间复杂度,想办法利用有序性,尽可能让一次判断可以达到一次循环的效果;
解题分析:对于所要求的target值,不妨在数组的两边加上相向指针,若头指针和尾指针之和大于target,则可以尝试让数值之和更小,既让尾指针向前移一位,因为不论是当前尾指针的值与任何数相加都一定会大于target(因为头指针是全数组最小的值),既可以永远排除掉当前的尾指针的值,再进行首位值想加,与target判断,若小了就将头指针向后移一位,重复上述过程,直到首尾之和等于target,然后返回头尾指针对应的id;
代码分析:
由于搞懂了逻辑会很简单所以我只强调需要注意的:
在此代码中关于输出的结果,因为题目默认数组的初始值从1id开始取,所以记得在结果处加一.
(代码取自b站up灵神,作者已在代码处标明,可自行搜索获得更完整的解题思路)
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
int left = 0, right = numbers.size() - 1;
while (true) {
int s = numbers[left] + numbers[right];
if (s == target) return {left + 1, right + 1}; // 题目要求下标从 1 开始
s > target ? --right : ++left;
}
}
};
作者:灵茶山艾府
链接:https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/solutions/1968341/san-shu-zhi-he-bu-hui-xie-xiang-xiang-sh-6wbq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。