(剑指offer)和为S的连续正整数序列 和为S的两个数字

和为S的连续正整数序列

        双指针问题。第一个指针指向队列的头,第二个指针指向队列的尾。第一个指针最多指向中间元素。如果当前序列的和大于S,那么第一个指针向前走;如果当前序列和小于S,第二个指针往后走。

vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int> > res;
        if(sum<3)
            return res;
        int left=1,right=2;
        int curSum=3;
        while(left<right&&left<(1+sum)/2) {
            if(curSum==sum) {
                vector<int> vec;
                for(int i=left;i<=right;++i) 
                    vec.push_back(i);
                res.push_back(vec);
                curSum-=left;
                ++left;
            }
            else if(curSum>sum) {
                curSum-=left;
                ++left;
            }
            else {
                ++right;
                curSum+=right;
            }
        }
        return res;
    }

  和为S的两个数字

            在递增数组中找出两个数字的和为S。同样的方法,只不过两个指针初始值分别指向数组的头部和尾部。

vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        int n=array.size();
        int left=0,right=n-1;
        vector<int> res;
        int mult=INT_MAX,curSum=0;
        while(left<right) {
            curSum=array[left]+array[right];
            if(curSum==sum) {
                //题目要求寻找乘积最小的那组
                if(array[left]*array[right]<mult) {
                    mult=array[left]*array[right];
                    vector<int> vec;
                    vec.push_back(array[left]);
                    vec.push_back(array[right]);
                    res=vec;
                }
                ++left;
                --right;
            }
            else if(curSum>sum) 
                --right;
            else
                ++left;
        }
        return res;
    }

猜你喜欢

转载自blog.csdn.net/w1157984197/article/details/79795333