剑指刷题 和为S的两个数 和为S的连续正数序列

 

题目描述

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

解题思路  首先把 和为sum的全部保存在 容器中,方法是从最小和最大的开始加和比较,如果加和大于sum,那让 最大的下标往小(左)移动,如果加和小于sum,让最小的下标 往大(右)移动。

全部存到容器后,再拿出来比较乘积,将乘积最小的两个数 放到最终的容器中。 

class Solution {
public:
	vector<int> FindNumbersWithSum(vector<int> array, int sum) {
		int min = 0, max = array.size()-1;
		vector<int> res;
		while (min<max)
		{
			if (array[min] + array[max] == sum)
			{
				res.push_back(array[min]);
				res.push_back(array[max]);
				min++;
				max--;
			}
			else if (array[min] + array[max]>sum)
			{
				max--;
			}
			else{
				min++;
			}
		}
		if (res.size() <= 2)
		{
			return res;
		}
		int mul = res[0] * res[1];
		int num_1 = res[0]; int num_2 = res[1];
		for (int i = 0; i<res.size(); i += 2)
		{
			if (res[i] * res[i + 1]<mul)
			{
				mul = res[i] * res[i + 1];
				num_1 = res[i];
				num_2 = res[i + 1];
			}
		}
		res.clear();
		res.push_back(num_1);
		res.push_back(num_2);
		return res;
	}
};

题目描述

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

输出描述:

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

解题思路:由于输出序列是连续的正数, 可以使用两个下标  small 和big ,small 指向 1,big 指向2, 然后间small到big区间所有正数相加  如果等于 sum  那么把这个区间 就放到vector中 ,如果 这个加和大于sum 那么让small++,如果这个加和小于 sum  那么让 big++  

 

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        int small=1,big=2;
        vector<vector<int> > res;
        while(big<sum)
        {
            int temp=0;
            for(int i=small;i<=big;++i)
            {
                temp+=i;
            }
            if(temp==sum)
            {
                vector<int>  v;
                for(int i=small;i<=big;++i)
                {
                        v.push_back(i);
                }
                res.push_back(v);
				big++;
				small++;
            }
            else if(temp<sum)
                big++;
            else
                small++;
        }
        return res;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值