题解 | #和为S的两个数字#

和为S的两个数字

http://www.nowcoder.com/practice/390da4f7a00f44bea7c2f3d19491311b

模仿#和为S的连续数列#中双指针的思路。
使用左右两个指针,左指针left从数组最左侧开始,右指针right从数组最右侧开始。
计算左右两个指针所指向的值的和,若该和大于sum,则left++,若该和小于sum,则right--。
直到左右指针之和等于sum,此时找到结果;或左右指针指向同一位置,此时无结果,终止循环。

这种做法最多只用遍历一遍数组,时间复杂度为O(n),不借用辅助数组,空间复杂度为O(1)。
但是要吐槽的是,实际运行时间极慢,全部用例使用了20ms,仅打败0.3%的用户。空间复杂度也不尽人意。看了下大家做的也基本都是双指针向中间逼近的,希望有能之士能给点优化的方法及建议。

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        vector<int> res;
        if(array.empty()){
            return res;
        }
        int left = 0;
        int right = array.size() - 1;
        while(right != left){
            int s = array.at(left) + array.at(right);
            if(s < sum){
                left++;
            }
            else if(s > sum){
                right--;
            }
            else{
                res.push_back(array.at(left));
                res.push_back(array.at(right));
                break;
            }
        }
        return res;
    }
};
全部评论

相关推荐

10-18 13:01
已编辑
西安理工大学 C++
小米内推大使:建议技能还是放上面吧,hr和技术面试官第一眼想看的应该是技能点和他们岗位是否匹配
点赞 评论 收藏
分享
offer多多的六边形战士很无语:看了你的博客,感觉挺不错的,可以把你的访问量和粉丝数在简历里提一下,闪光点(仅个人意见)
点赞 评论 收藏
分享
小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务