Leetcode167—两数之和II-输入有序数组

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。

函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

说明:

返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:

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

 

最简单的思路就是用两层for循环,寻找数组中两个数的和等于targer

vector<int> twoSum(vector<int>& numbers, int target) {
        
        for(int i=0;i<numbers.size();i++)
        {
            for(int j=i+1;j<numbers.size();j++)
            {
                if(numbers[j]>target &&target>0)
                {
                    break;
                }
                if(numbers[i]+numbers[j]==target)
                {
                    return {i+1,j+1};
                }
            }
        }
        return {0,0};
    }

但是这样效率很低,执行时间268ms,内存消耗9.6MB

另一个思路,看到是从数组中寻找两个位置的数字,就不由得想到可以用双指针来解决。

令两个指针分别从数组的两头出发,相当于将最大值和最小值相加,左边的指针向右移动会使和增大,右边的指针向左移动会使和减小,因此根据两个位置和的情况改变指针的位置直到找到结果。

 vector<int> twoSum(vector<int>& numbers, int target) {
        if(numbers.empty())
        {
            return {0,0};
        }      
        int first=0;
        int last=numbers.size()-1;
        while(first<last)
        {
            if(numbers[first]+numbers[last]==target)
            {
                return {first+1,last+1};
            }
            else if(numbers[first]+numbers[last]>target)
            {
                last--;
            }
            else if(numbers[first]+numbers[last]<target)
            {
                first++;
            } 
        }
        return {0,0};
    }

使用双指针这种方法时间复杂度就只有O(n),在leetcode上提交致性用时4ms,内存消耗9.6MB,相比于原来的方法时间减少了很多

Leetcode167—两数之和II-输入有序数组Leetcode167—两数之和II-输入有序数组 静静静雅 发布了12 篇原创文章 · 获赞 0 · 访问量 1990 私信 关注
上一篇:Flask路由之重定向


下一篇:每天一道面试题LeetCode 01 -- 两数之和