剑指offer-题41:和为s的两个数字VS和为s的连续正数序列

题目描述

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

题二:输入一个正数s,打印出所有和为s的连续正数序列(至少含有2个数),例如输入15,由于1+2+3+4+5=4+5+6=7+8=15。所以结果打印出3个连续序列1 ~ 5,4 ~ 6,7 ~ 8

实验平台:牛客网


解决思路:

题一的解题思路:

这里写图片描述
这里写图片描述
由于题目要求在有多对数字的和等于S的情况下,需要输出两个数的乘积最小的。所以,我们需要遍历整个数组,当两个数字的和等于S时,用两个变量分别存储此时两个数字的值,从而在之后的遍历中,如果又有新的两个数字的和等于S,将它们的积与之前存储的两个变量的积相比较,取积小的两个数即可。

题二的解题思路:
这里写图片描述
这里写图片描述

题一

java:

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        ArrayList<Integer> twoNum = new ArrayList<Integer>();
        if (array.length == 0) {
            return twoNum;
        } else {
            int smallIndex = 0;
            int bigIndex = array.length - 1;
            int smallNum = 0;
            int bigNum = 0;
            int multyplyResult = array[bigIndex] * array[bigIndex - 1];

            while (smallIndex < bigIndex) {
                if (array[smallIndex] + array[bigIndex] == sum && array[smallIndex] * array[bigIndex] <= multyplyResult) {
                    smallNum = array[smallIndex];
                    bigNum = array[bigIndex];
                    multyplyResult = smallNum * bigNum;
                    bigIndex--;
                } else if (array[smallIndex] + array[bigIndex] > sum) {
                    bigIndex--;
                } else {
                    smallIndex++;
                }
            }
            if(smallNum + bigNum == sum){
                twoNum.add(new Integer(smallNum));
                twoNum.add(new Integer(bigNum));
            }
            return twoNum;
        }
    }
}

题二

java:

import java.util.ArrayList;
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
       ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
        if (sum < 2) {
            return list;
        } else {
            int small = 1;
            int big = 2;
            int middle = (sum + 1) / 2;
            int curSum = small + big;
            while (small < middle) {
                if (curSum == sum) {
                    list.add(getList(small, big));
                }
                while (curSum > sum && small < middle) {
                    curSum -= small;
                    small++;
                    if (curSum == sum) {
                        list.add(getList(small, big));
                    }
                }
                big++;
                curSum += big;
            }
            return list;
        }
    }

    public ArrayList<Integer> getList(int small, int big) {
        ArrayList<Integer> arrayList = new ArrayList<Integer>();
        for (int i = small; i <= big; i++) {
            arrayList.add(new Integer(i));
        }
        return arrayList;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值