1_相向双指针_leetcode_167_1

167. 两数之和 II - 输入有序数组

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

你所设计的解决方案必须只使用常量级的额外空间。

c 复制代码
示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
c 复制代码
示例 2:
输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。
c 复制代码
示例 3:
输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 
c 复制代码
提示:

2 <= numbers.length <= 3 * 104
-1000 <= numbers[i] <= 1000
numbers 按 非递减顺序 排列
-1000 <= target <= 1000

方法1------ 直接枚举

c 复制代码
// C
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {
	*returnSize = 2; // 题目保证一定会给存在解
	int *ret = (int * )malloc(sizeof(int) * 2);
	for(int i = 0;i<numbersSize;i++){
		for(int j = i+1;j<numbersSize;j++){
			if(numbers[i]+ numbers[j] == target){
				ret[0] = i + 1;
				ret[1] = j + 1;
				break;
			}
		}
	}
	return ret;
}
cpp 复制代码
// C++
class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
  		vector<int> ret{1001,1001}; 		
 		for(int i = 0;i<numbers.size();i++){
		for(int j = i+1;j<numbers.size();j++){
			if(numbers[i]+ numbers[j] == target){
				ret[0] = i + 1;
				ret[1] = j + 1;
				break;
			}
		}
	}
	return ret;	
};
  • 时间复杂度:O( n 2 n^2 n2)
  • 空间复杂度:O(1)

方法2------ 相向双指针

注意到 数组是有序的。利用有序数组的性质(数组升序排列)。

  • 初始化左右指针l = 0;r =numberSize-1;
  • 枚举当前最小值 m i n l min_l minl + 当前数组最大值 m a x r max_r maxr
  • m i n l min_l minl + m a x r max_r maxr > target 说明最大值 m a x r max_r maxr 过大,增大最小值没有意义,需要最大值缩小,即右指针r向左移动。
  • m i n l min_l minl + m a x r max_r maxr < target 说明最小值 m i n l min_l minl 过小,增大最小值没有意义,需要最大值缩小,即右指针l向右移动。
c 复制代码
//C
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {
    int *ret = (int *)malloc(sizeof(int)*2);
    memset(ret,0,sizeof(int));
    *returnSize = 2;
    int l = 0,r = numbersSize - 1;
    int mid,sum;
    while(l<r){
        sum = numbers[l] + numbers[r];
        if(sum == target){
            ret[0] = l+1;
            ret[1] = r+1;
            return ret;
        }else if(sum > target){
            r--;
        }else{
            l++;
        }
    }
    return NULL;
}
cpp 复制代码
//C++
class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        vector<int> ret{1001,1001};
        int l = 0;
        int r = numbers.size() - 1;
        while( l < r){
            if (numbers[l] + numbers[r] > target) r--;
            else if(numbers[l] + numbers[r] < target) l++;
            else if(numbers[l] + numbers[r] == target) {
                ret[0] = l+1;
                ret[1] = r+1;
                break;
            }
        }
         return ret;
    }
   
};
python 复制代码
# python
class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        l,r = 0,len(numbers)-1
        while l < r:
            sum = numbers[l] + numbers[r]
            if  sum > target: r-=1
            elif sum < target: l+=1
            else: return[l+1,r+1]
        return None
java 复制代码
// java
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int l = 0;
        int r = numbers.length-1;
        int[] ret = {1001,1001};
        
        while(l < r){
            if(numbers[l] + numbers[r] == target){
                 ret[0] = l + 1;
                 ret[1] = r + 1;       
                break;
            }else if(numbers[l] + numbers[r] > target) r--;
            else l++;
        }
        return ret;
    }

}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
相关推荐
大侠归来9 分钟前
C 语言 | 在函数中操作数组
c语言·c++·算法
怕浪猫5 小时前
GEO 优化到底是什么?AI时代内容创作者必须懂的新技能
算法·面试·github
朝朝辞暮i6 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
Evand J7 小时前
【MATLAB例程】三维RRT+APF避障路径规划与到达角(AOA)定位算法|三维路径优化与定位仿真例程
算法·matlab·路径规划·代码·定位·rrt·aoa
weixin_307779138 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
朝朝辞暮i8 小时前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法
朝朝辞暮i9 小时前
C++ 第 29 课:回调函数 Callback
开发语言·c++·算法
Godspeed Zhao9 小时前
现代智能雷达技术14——算法(0)
线性代数·算法·雷达
可乐ea9 小时前
Agent 模型分级升级路由:用置信度阈值把贵模型省下来
人工智能·算法·机器学习·结构化输出·置信度路由·模型升级路由·大模型成本优化
Navigator_Z10 小时前
LeetCode //C - 1278. Palindrome Partitioning III
c语言·算法·leetcode