首页 > 其他分享 >【剑指Offer】42、和为S的两个数字

【剑指Offer】42、和为S的两个数字

时间:2023-08-23 22:45:07浏览次数:35  
标签:两个 数字 Offer ArrayList 42 high xy low

【剑指Offer】42、和为S的两个数字

题目描述:

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

输出描述:

对应每个测试案例,输出两个数,小的先输出。

解题思路:

对于本题,比上一题简单一些。看到题目,我们的第一感觉是暴力解法,即先在数组中固定一个数字,然后依次判断数组中其他数字与它的和是不是等于S。这显然复杂度为O(n^2)。

进一步分析,类似于上一题的思路,我们可以使用双指针解法。我们定义两个指针low和high,low从左向右遍历,high从右向左遍历,也就是low指向第一个元素,high指向最后一个元素。首先,比较low和high的和与给定的S,如果和小于S,那么就要增大输入值,即low向右移动一位;如果和大于S,那么就要减小输入值,即high向左移动一位;如果和等于S,那么这两个数字就是我们要找的数字。依次循环查找,直到low和high相等为止。

这个算法只需要最多一次扫描,复杂度为O(n),并且还有一个好处,就是这样找到的两个数满足乘积最小的条件。这可以这样证明:考虑x+y=C(C是常数),xy的大小。不妨设y>=x,y-x=d>=0,即y=x+d, 2x+d=C, x=(C-d)/2, xy=x(x+d)=(C-d)(C+d)/4=(C2-d2)/4,也就是xy是一个关于变量d的二次函数,对称轴是y轴,开口向下。d是>=0的,d越大, xy也就越小。

举例:

编程实现(Java):

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        ArrayList<Integer> res=new ArrayList<>();
        int low=0,high=array.length-1;
        while(low<high){
            int curSum=array[low]+array[high];
            if(curSum==sum){ //找到一个解
                res.add(array[low]);
                res.add(array[high]);
                break;
            }
            else if(curSum<sum)
                low++;
            else
                high--;
        }
        return res;
    }
}

标签:两个,数字,Offer,ArrayList,42,high,xy,low
From: https://www.cnblogs.com/bujidao1128/p/17652955.html

相关文章

  • 剑指 Offer 10- I. 斐波那契数列(简单)
    题目:classSolution{//动态规划public:intfib(intn){if(n<=1)returnn;vector<int>dp(2,0);//确定dp数组以及下标的含义dp[0]=0;//dp数组初始化dp[1]=1;for(inti=2;i<=n;i++){//递推顺序从......
  • 剑指 Offer 41. 数据流中的中位数(困难)
    题目:classMedianFinder{//暴力解法:每添加一个数字后用sort进行排序,然后返回中位数,时间复杂度:nlogn,会超时。因此采用**二分法查找并进行插入的方法**。时间复杂度:lognpublic:vector<int>nums;//初始化一个当前数组/**initializeyourdatastructure......
  • python3_关于数字的一些操作记录
    1、数字整数、小数部分分离方法1:math模块提供的floor方法xs=num-math.floor(num)zs=num-xsreturn 'zhengShu: {0}, xiaoShu: {1}'.format(str(zs),str(xs))方法2:将浮点类型的数字转化为字符串zs,xs=str(num).split('.')return 'zhengShu: {0}, xiaoShu: {1}'.fo......
  • 2.1-20000内的水花仙数字
    #include<iostream>#include<math.h>usingnamespacestd;intmain(){intnum=0,count=0,sum=0;cin>>num;intx=num;while(x!=0){x=x/10;count++;}x=num;for(inti=0;i<count;......
  • 百望云&华为云共建零售数字化新生态 聚焦数智新消费升级
    零售业是一个充满活力和创新的行业,但也是当前面临很大新挑战和新机遇的行业。数智新消费时代,数字化转型已经成为零售企业必须面对的重要课题。8月20日-21日,以“云上创新韧性增长”为主题的华为云数智新消费创新峰会2023在成都隆重召开。峰会上,华为云正式发布了“零售数字化加速......
  • “小巨人”企业数字化解决方案:LeaRun低代码开发平台
    中小企业是社会经济发展的生力军,目前,中小企业数字化转型是我国企业数字化转型的主战场,在我国实体经济高质量发展中发挥着不可替代的作用。“专精特新”是指具备专业化、精细化、特色化、新颖化四大优势的企业。“小巨人”企业则是“专精特新”中小企业中,专注于细分市场、创新能力......
  • 数字时代的先驱者,「Adobe之父」离世,享年82岁!
    原创 | 文BFT机器人JohnWarnock于当地时间8月19日辞世,享年82岁。他作为图形和出版软件公司Adobe的共同创始人,被誉为“Adobe之父”,在计算机图形学和电子出版等领域都做出了重大的贡献,为后人留下一笔丰厚的“遗产”,让我们一起来梳理他传奇的一生!01早年经历奠定基础1940年,Warnoc......
  • 穿起“新架构”的舞鞋,跳一支金融数字化转型的华尔兹
    华尔兹,是男女两位舞者,通过形体的控制,舞步技巧的发挥,完美配合呈现而出的一种舞蹈形式。华尔兹舞姿,如行云流水、潇洒自如、飘逸优美,素有“舞中皇后”的美称。在跳华尔兹的时候,如果舞者双方缺乏默契,不是踩对方的脚就是踩裙子,再美的舞蹈动作也会贻笑大方。从企业的角度,业务部门和IT部门......
  • 穿起“新架构”的舞鞋,跳一支金融数字化转型的华尔兹
    华尔兹,是男女两位舞者,通过形体的控制,舞步技巧的发挥,完美配合呈现而出的一种舞蹈形式。华尔兹舞姿,如行云流水、潇洒自如、飘逸优美,素有“舞中皇后”的美称。在跳华尔兹的时候,如果舞者双方缺乏默契,不是踩对方的脚就是踩裙子,再美的舞蹈动作也会贻笑大方。从企业的角度,业务部门和IT......
  • C#计算24点(1-13数字)
    Node.csnamespacecount24{classNode{publicNode(doubleval,Stringe){value=val;exp=e;}publicNode(){}publicdoublevalue;publicStringexp......