连续子序列的和为s的数字及其扩展

连续子序列和为s的数字

为了能够得到线性时间复杂度的算法,可以考虑两个标记,一个指向头部,一个指向尾部
1. 和大了就++head
2. 和小了就–tail

class Solution {    //和为sum的两个数字,因为这是个有序的序列,自然需要利用
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        lex 实现原理std::vector<int> ret;
        if(array.size()==0)
            return ret;
        int phead=0;
        int ptail=array.size()-1;
        while(phead!=ptail){
            int tmpsum=array[phead]+array[ptail];
            if(tmpsum==sum){
                ret={array[phead],array[ptail]};
                break;
            }
            else if(tmpsum>sum)
                ptail--;
            else
                phead++;
        }
        return ret;
    }
};

寻找连续序列和为sum的序列

借鉴上面的思路,考虑一个标记small指向1,一个标记big指向2
1. small和big之间的和大于sum,++small;
2. small和big之间的和小于sum,++big;
3. 等于,则记录这个序列,++small继续查找

class Solution {    //连续子序列的和,一样保证一个连续的区间,移动最小的和最大的进行移动,求得所有的。
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        int small=1;
        int big=2;
        int middle=(sum+1)/2;
        int tmpsum=small+big;
        std::vector<vector<int>> ret;
        while(smallif(tmpsum==sum){
                std::vector<int> v;
                for(int i=small;i<=big;i++)
                    v.push_back(i);
                ret.push_back(v);
                tmpsum-=small++;
            }
            else if(tmpsum>sum){
                tmpsum-=small++;
            }
            else{
                tmpsum+=++big;
            }
        }
        return ret;           
    }
};

你可能感兴趣的:(算法与数据结构,剑指offer)