马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、标题形貌
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减序次分列 ,请你从数组中找出满意相加之和便是目的数 target 的两个数。假如设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 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 * 104
- -1000 <= numbers[i] <= 1000
- numbers 按 非递减顺序 排列
- -1000 <= target <= 1000
- 仅存在一个有效答案
复制代码 三、解题思绪
- 根本思绪:
双指针,头指针加尾指针遍历,相加便是目的值则返回下标。
- 具体思绪:
- 预处置惩罚:界说头指针 i 和 尾指针 j ,用于遍历,初始化为 0 和 n-1 。序列按非递减序次分列,以是指针 i 所指元素最小,j 最大。
- 遍历:判定两指针所指元素之和是否便是目的值,假如小于目的值,则增大两元素之和,而尾指针已经是最大,以是只能增大头指针,即 i++ ;假如大于目的值,则减小两元素之和,即 j-- ;假如相称,则找到答案,则返回两元素下标。【使用只能增长和只能淘汰 来淘汰搜刮空间,将 O(n2)\Omicron(n^2)O(n2) 低沉至 O(n)\Omicron(n)O(n)
四、参考代码
时间复杂度:O(n)\Omicron(n)O(n)
空间复杂度:O(1)\Omicron(1)O(1)- class Solution {
- public:
- vector<int> twoSum(vector<int>& numbers, int target) {
- int n=numbers.size();
- int i=0,j=n-1;
- vector<int> ans;
- while(i<j){
- if(numbers[i]+numbers[j]<target)
- i++;
- else if(numbers[i]+numbers[j]>target)
- j--;
- else{
- ans.push_back(i+1);
- ans.push_back(j+1);
- break;
- }
- }
-
- return ans;
- }
- };
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |