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

和为S的两个数字

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

条件:数组非递减排序(测试案例中并非只有题目中所说的非递增排序)
思路:首先,若给定数组为空,则返回空
其次,先找到数组中数值接近目标值一半的元素下标,以此为中心向两边拓展查找范围,找出所有可能
最后,由于结果数组中元素应该是两两为一对,因此计算所有可能解得乘积,再找出乘积最小值并记录位置,然后反推出答案数组中的所对应的实际元素。

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        if(array.empty()) return vector<int> ();
        vector<int> ans;
        int i=0, temp=0;
        while(temp==0)
        {
            if((array[i]<=sum/2) && (array[i+1]>=sum/2))
                temp = i;
            i++;
        }

        int first = temp;
        int last = temp+1;
        while(first>=0 && last<array.size())
        {
            if((array[first]+array[last]) > sum)
                --first;
            else if((array[first]+array[last]) < sum)
                last++;
            else
            {
                ans.push_back(array[first]);
                ans.push_back(array[last]);
                first--;
            }
        }

        if(first<-1 || last>array.size() || ans.empty())
            return {};

        if(ans.size()==2)
            return ans;
        else
        {
            vector<int> mul;
            for(int i=0;i<ans.size()/2;i++)
                mul.push_back(ans[2*i]*ans[2*i+1]);

            int cnt=0;
            int num=mul[0];
            for(int j=1;j<mul.size();j++)
            {
                if(num>mul[j])
                {
                    num=mul[j];
                    cnt=j;
                }
            }

            vector<int> comp;
            comp.push_back(ans[2*cnt]);
            comp.push_back(ans[2*cnt+1]);
            return comp;
        }
    }
};

时间复杂度:O(n)
空间复杂度:O(n)

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-26 16:06
已编辑
快手电商 后端 23k-35k
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务