当前位置: 首页 > article >正文

1_相向双指针_leetcode_167_1

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

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1]numbers[index2] ,则 1 <= index1 < index2 <= numbers.length
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1index2
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。

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

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

方法1—— 直接枚举

// 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;
}
// 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
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;
}
//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
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
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)

http://www.kler.cn/a/520639.html

相关文章:

  • Web3.0时代的挑战与机遇:以开源2+1链动模式AI智能名片S2B2C商城小程序为例的深度探讨
  • 深度学习探索:ChatGPT数据分析精髓 梯度下降优化方法深度剖析
  • 深入探索 Vue 3 Markdown 编辑器:高级功能与实现
  • 运用python进行多任务学习过程中,手动调整权重时,如何选择项目并确定合适的权重值?
  • 解决CentOS9系统下Zabbix 7.2图形中文字符乱码问题
  • 向量和矩阵算法笔记
  • UE学习日志#11GAS--ASC源码简要分析9 AbilitySystemGlobals分析2 初始化相关
  • Chapter 3-17. Detecting Congestion in Fibre Channel Fabrics
  • Java多线程与高并发专题——保障原子性
  • 【FreeRTOS 教程 五】FreeRTOS 内存管理细致讲解
  • easyexcel-导入(读取)(read)-示例及核心部件
  • 记录让cursor帮我给ruoyi-vue后台管理项目整合mybatis-plus
  • 第05章 04 VTK标量算法概述
  • 【时时三省】(C语言基础)对比一组函数
  • 如何使用 OpenSSL 检查 Linux 中的 SSL 证书
  • 解决查看服务器ESN(许可证管理)
  • HarmonyOS:MVVM模式
  • 一文大白话讲清楚webpack基本使用——16——图片压缩
  • vscode无法格式化go代码的问题
  • 第24篇:Python开发进阶:掌握Python编程中的调试技巧
  • 【Leetcode 每日一题】40. 组合总和 II
  • 股指期货的交易规则及细节详解
  • web前端4--css盒模型
  • 渗透测试技法之口令安全
  • Day35:字符串的大小写转换
  • MFC常用操作