1_相向双指针_leetcode_167_1

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

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

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

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

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

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)
相关推荐
kkeeper~11 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
wabs66612 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_8769641313 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
嗝o゚13 小时前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本13 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Ulyanov15 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真
数据科学小丫15 小时前
特征工程处理
人工智能·算法·机器学习
z落落15 小时前
C#参数区别
java·算法·c#
c2385616 小时前
vector(下)
数据结构·算法
z落落16 小时前
C# 冒泡排序+选择排序 + Array.Sort 自定义排序
数据结构·算法