new 和为s的数字,和为s的连续正数序列

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/mengmengkuaipao/article/details/102721268
  1. 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得他们的和正好是s,如果有多对数字和等于s,则输出任意一对即可。
    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
    输出描述:
    对应每个测试案例,输出两个数,小的先输出。

**注!**不要被题目误导了!证明如下,清晰明了:
//输出两个数的乘积最小的。这句话的理解?
假设:若b>a,且存在,
a + b = s;
(a - m ) + (b + m) = s
则:(a - m )(b + m)=ab - (b-a)m - m*m < ab;说明外层的乘积更小,

直接

固定一个数,遍历找另一个数,时O(n^2)

很快的反应能力,只要想到一种就赶紧告诉面试官

双指针

开头一个,结尾一个,开始判断

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        
        ArrayList<Integer> result=new ArrayList<>();
        if(array==null||array.length==0||sum<0)
            return result;
        int low=0,high=array.length-1;
        
        while(low<high){
            int s=array[low]+array[high];
            if(s==sum){
                
                result.add(array[low]);
                result.add(array[high]);
                return result;
           //     high--; 这个不用再比了,就这一个两边乘积最小
            }
            else if(s<sum)
                low++;
            else
                high--;
        }
        return result;
        
    }
}
  1. 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
    输出描述:
    输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

双指针 滑动窗口

定义两个指针,分别为 low=1,high=2。

import java.util.ArrayList;
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
        ArrayList< ArrayList<Integer> > result=new ArrayList<ArrayList<Integer> >();

        int low=1;
        int high=2;
        while(high>low){
            //由于是连续的,差为1的一个序列,那么求和公式是(a0+an)*n/2
            int s=(high+low)*(high-low+1)/2;
            if(s==sum){
                ArrayList<Integer> res=new ArrayList<>();
                for(int i=low;i<=high;i++){
                    res.add(i);
                }
                result.add(res);
                high++;  //别忘了这个操作
            }
            else if(s<sum)
                high++;
            else
                low++;
        }
        return result;
        
    }
}

总结

求连续序列的和应用了一个小技巧,通常我们可以用循环得到连续序列和,但每次操作只是加一个或者减一个,可以在前面和的基础上求操作之后的序列和,可减少很多不必要的运算

猜你喜欢

转载自blog.csdn.net/mengmengkuaipao/article/details/102721268