【leetcode】两数之和 II - 输入有序数组c++

题目描述:
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。

函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。

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

示例1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。

示例2:

输入:numbers = [2,3,4], target = 6
输出:[1,3]

示例3:

输入:numbers = [-1,0], target = -1
输出:[1,2]

代码:

#include<string>
class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        vector<int> v;
        int n=numbers.size(),s=numbers[n-1]+1+1000;
        int a[s];
        memset(a,0,sizeof(int)*s);
        cout<<endl;
        for(int i=0;i<n;i++){
            int m = target-numbers[i];
            if((m+1000<s)&&a[m+1000]==1){
                v.push_back(i+1);
                for(int j=i+1;j<n;j++){
                    if(numbers[j]==m){
                        v.push_back(j+1);
                        break;
                    }
                }
                break;
            }
        }
        return v;
    }
};

直接使用暴力解法双层for循环会超时。

使用数组查询的方式代替for循环查询,只需要判断对应的数组值即可,查询时间为常数。

a[m]=1则表示m在输入的数组numbers中,即找到了结果。

注意输入的numbers数组中的数字可能为负数,范围是-1000 <= numbers[i] <= 1000,所以在以numbers[i]为下标用数组a记录时,应加1000,保证a数组下标为正数,即a[numbers[i]+1000]=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值