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

剑指offer ——输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 运行结果:分析:先选定第一个数字,然后将后面的数字依次遍历求和,并与需要的数字比较,需要n-1次,如果第一个数字不行,选择第二个,依次遍历求和。。。。需要n^2次,时间复杂度比较高,但也是可以的,在面试中,如果没有更好的办法写这个也是可以的,毕竟要比交白卷好得多,这里不展示此代码。下面将一种简单的方法:先看题目要求:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果... 阅读详情

以后闲来无事做可以在牛客网上刷刷一下编程题,今天刷到了一题有关数组的题目,记忆中有同学在面试中被问到了,话不多说,先看题,题目如下:

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

像这种算法题,真的不建议一上来就巴拉巴拉开始写代码,最主要的还是先要明白题目的意思,理清思路,然后在编程。这道算法题我觉得就是一个很典型的例子。很多同学看到题目,可能就在纠结,和为S,先遍历数组呀,然后用一个临时变量去存储满足和为S的两个数的乘积,还要保存这两个数的角标,感觉就不好实现,就算实现了,复杂度肯定也不低。

其实,在拿到算法题之前,我们可以先先分析题目,先尝试着去用数学的思维去看能不能找到突破口。像这个题目,很明显“递增排序的数组”“两个乘积最小”,要想一个递增的数列中两个数乘积最小,那么满足和为S的几组数中,肯定是差值最大的那组数,他们的乘积是最小的(高中数学里面知识)。这样这个题目就变的很简单了,我们只需定义两个指针,一个指向头,一个指向尾,判断头尾指针数组的元素之和跟S去比较,知道等于S,输出这两数a,b,很明显ab的乘积就是最小的。

具体代码如下:

/**
	 * @param 输入一个递增的数组
	 * @param 输入和为S
	 * @return 返回
	 */
	private static ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
		ArrayList<Integer> arrayList = new ArrayList<Integer>();
		int head=0,tail = array.length-1;  //定义一个头指针,一个尾指针
		//直到头指针大于尾指针时,退出循环
		while (head<tail) {
			//采用两段到中间夹逼的方式,查找满足条件的数  
			if ((array[head]+array[tail])>sum) {
				tail--;
			}	
			else if ((array[head]+array[tail])<sum) {
				head++;
			}else    
			{
				//一旦满足条件,则ab的乘积一定是最小的,直接退出循环即可。
				arrayList.add(array[head]);
				arrayList.add(array[tail]);
				break;
			}
		}
		return arrayList;
	}

这道算法题很简单,只是一个单纯的数组相关的题目。当然在面试中我们被问到这么简单的原题,可能性不大,但是狡猾的面试官也可能以此简单题为模板去考验我们,这样既会让你感觉到题目似曾相识,还会让你感觉到云里雾里。

如果将上述题目改编一下,聪明的小伙伴们还会做吗?如题:

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

这道题很明显是上道题的变种题,但是有了上面题目的经验,做这道题也不是很难,题目让我们求3个数的乘积最小值,又是递增数组,那能否将三个数abc(其中a<b<c)的乘积最小值,变为a*min(bc)呢?很明显是可以的。当我们将a确定时,这道题就跟上面一样的,也就等价为:  当两个数满足和为(S-a),当bc乘积最小时,求b、c。

也就是说,我们只需遍历数组,确定a值,然后bc的值可以转换为上面两个数的方法去解决。只不过现在的头指针不是从0开始,而是从a的角标后一位开始。

代码如下:

	/**
	 * @param array	输入一个递增的数组
	 * @param sum	输入和为S
	 * @return
	 */
	private static ArrayList<Integer> FindThreeWithSum(int[] array, int sum) {
		ArrayList<Integer> arrayList;
		ArrayList<Integer> resultList = new ArrayList<Integer>();
		for (int i = 0; i < array.length; i++) {
			arrayList = FindTwoNumbersWithSum(array,i,sum-array[i]);  //一旦其中一个数确定,剩余两个数的和sum-array[i]也随之确定
			if (!arrayList.isEmpty()) {
				resultList.add(array[i]);
				resultList.addAll(arrayList);
				break;
			}
		}
		return resultList;
	}

	/**
	 * @param array	输入一个递增的数组
	 * @param i		数组角标i为头指针
	 * @param sum	输入和为S
	 * @return  两个数乘积的最小值时,存有两个数的集合
	 */
	private static ArrayList<Integer> FindTwoNumbersWithSum(int[] array,int i, int sum) {
		ArrayList<Integer> arrayList = new ArrayList<Integer>();
		int head=i,tail = array.length-1;  //定义一个头指针,一个尾指针
		//直到头指针大于尾指针时,退出循环
		while (head<tail) {
			//采用两段到中间夹逼的方式,查找满足条件的数  
			if ((array[head]+array[tail])>sum) {
				tail--;
			}	
			else if ((array[head]+array[tail])<sum) {
				head++;
			}else    
			{
				//一旦满足条件,则ab的乘积一定是最小的,直接退出循环即可。
				arrayList.add(array[head]);
				arrayList.add(array[tail]);
				break;
			}
		}
		return arrayList;
	}

代码仅供参考,第一次写博客,请各位多指正吧,写博客的习惯希望自己能坚持吧。以后会不断更新剑指offer与LeetCode里面一些我觉得有意思的题目。

(java)和为S的两个数字:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 文章目录题目描述分析代码 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。 分析 a+b=s,a和b越远乘积越小 假设:若b>a,且存在, a + b = s; (a - m ) + (b + m) = s 则:(a - m )(b + m)=ab - (b-a)m - m*m < ab;说明外层的乘积更小 也就是说依然是左右夹逼法!!!只需要2个指 阅读详情

相关推荐

从医疗成像到工业检测:CMOS图像传感器NIR技术的最新应用案例解析

本文深入解析了CMOS图像传感器NIR技术在医疗成像和工业检测中的最新应用案例。通过提升量子效率至70%,NIR技术实现了血管可视化、材料缺陷检测等突破性进展,显著提高了医疗诊断精度和工业质检效率。文章还探讨了系统集成关键考量和前沿发展趋势。

weixin_30879169的博客 87

输入一个递增排序的数组和一个数字 s

题目: 输入一个递增排序的数组和一个数字 s。 在数组中查找两个数,使得它们的和正好是 s。 如果有多对数字的和等于 s,输出任意一对即可。 解答: 1 public class Solution { 2 3 public static void main(String[] args) { 4 int[] data = {1,2,4...

weixin_30292745的博客 562

LT9611EX芯片实战:如何用双端口MIPI转HDMI1.4打造高清播放器(附配置代码)

本文详细介绍了如何使用龙迅半导体的LT9611EX芯片实现双端口MIPI转HDMI1.4的高清播放器开发。内容涵盖芯片特性、硬件设计要点、寄存器配置技巧及完整代码实现,特别适合嵌入式视频处理应用,如机顶盒和便携式媒体播放器。

weixin_29256771的博客 321

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可

方法一,双指针 int*twoSum(int*nums,intnumsSize,inttarget,int*returnSize){ intleft=0; intright=numsSize-1; int*ret=(int*)malloc(sizeof(int)*2); while(left<right) { if(nums[left]+nums[right]>target) { ...

qq_70799748的博客 781

RAG开源框架深度评测:从RAGFlow到Dify的实战选型指南

本文深度评测了主流RAG开源框架(RAGFlow、Dify、WeKnora)的核心能力与实战表现,提供企业级选型指南。重点对比了文档解析、检索性能和生产部署等关键指标,揭示RAGFlow在复杂文档处理、Dify在低代码开发、WeKnora在腾讯生态集成的差异化优势,并给出技术选型决策树与成本优化方案。

weixin_29294597的博客 825

STM32CubeMX和华为LiteOS Studio开发STM32

传统的STM32的开发通常使用Keil/IAR这类开发软件,随着物联网时代的到来,传统嵌入式的发展不断向物联网方向靠拢,而Keil/IAR这类开发软件无法满足IoT一站式的开发,华为LiteOS Studio结合STM32CubeMX可以快速,高效地进行物联网开发,本文提供一种开发思路及环境的配置方法。...

weixin_45680600的博客 2832

输入一个递增排序的数组和一个数字s,在数组中查找两个数,得它们的和正好是s。如果有多对数字的和等于s,输出任意一对

输入一个递增排序的数组和一个数字s,在数组中查找两个数,得它们的和正好是s。如果有多对数字的和等于s,输出任意一对

VipPetergee的博客 1236

Python读取Matlab v7.3数据

文章目录Matlab保存数据Python读取 v7.3 Mat Matlab保存数据 在matlab设置中,常规->MAT文件,选择MATLAB版本7.3或更高版本保存数据。 注意保存数据的文件名为 corre.mat,保存的数据数组为data; 后面python的读取中会用到这两个参数 Python读取 v7.3 Mat 先安装hdf5storage库,再使用以下代码,就可以读取到mat中的数据,注意 import hdf5storage import numpy as np dataDi

weixin_43121914的博客 1081

Java之《剑指Offer》(超详细):输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

1. 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 题目分析: 递增的序列,定义两个数组的下标索引index,left = 0;right = array.length-1 对于多个数字等于S,输出乘积最小的两位数。也就是最外层的数,1,2,3,4;也就是1,4的乘积最小 当和小于sum的时候,left++;当和大于sum的时候,right--; 注意return返回值,当return...

CodingLJ 496

【SLAM论文笔记】SplaTAM论文小结

参考方法有ORB-SLAM3、Point-SLAM、NICE-SLAM、Kintinuous、ElasticFusion,测试数据集有ScanNet++、Replica、TUM-RGBD、Orig-ScanNet,SpaTAM并未在全部对比均为第一,表现最佳的是在ScanNet++、Replica,ScanNet++上SplaTAM方法位姿精度比第2名ORB-SLAM3高两个数量级,在TUM。上无稀疏SLAM结果,NICE-SLAM与Point-SLAM占优。SplaTAM基本做到了SOTA。

持之以恒 1008

Linux服务器上后台运行jupyter notebook/Lab

1 安装配置教程2 后台运行jupyter3 更改运行环境kernel4 SSH端口转发 1 安装配置教程 可以参考:https://www.cnblogs.com/thousfeet/p/10647102.html 2 后台运行jupyter screen -S jupyter # 新建一个名为jupyter的后台screen # 在base环境下,先 cd 到指定文件目录 jupyter notebook # or jupyter lab 3 更改运行环境kernel 需要手动为每个环境添加内.

strivequeen的博客 1834

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

剑指offer算法题 数学 数组 双指针 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。 题目分析 数列满足递增,设两个头尾两个指针i和j, 若ai + aj == sum,就是答案(相差越远乘积越小) 若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1 若ai + aj < sum,ai肯定不是答

gaozhuang63的博客 528

【YOLOv12改进trick】高效多尺度卷积注意力EMCAD_Block模块引入YOLOv12,实现涨点和效率提升,含创新点Python代码

EMCAD引入YOLOv12模块,实现高效多尺度注意力模块引入到YOLOv12中的快速涨点及效率提升

向上生长的程序媛的博客 851

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

题目: 对应每个测试案例,输出两个数,小的先输出。 思路一:暴力法,一个一个比对吧。 import java.util.ArrayList; import java.util.ArrayList; import java.util.HashMap; import java.util.Map.Entry; public class Solution { public ArrayLis...

王文强的博客 1223

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。 看到这个题其实看起来是个很简单的题目,我首先想到的思路就是: 思路 首先明白该数组是个递增数组。 1-用两个指针指该数组的两头 pl,ph 2-当两个指针所指的值之和>S时,ph–;之和<S...

兰斯兰斯 270

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 解题思路:首先想到的是,两个数相加之和是S,那么这两个数必定分布在sum/2的左右两边。此外,要求当有多对数字的和等于S,输出两个数的成绩最小的,那么就是输出最靠数组两端的数。证明: a< b,a+b=S,那么S=(a-m)+(b+m)=ab-(b-a)m-m*m...

qq_39857987的博客 795

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

剑指offer试题编程练习40(java) 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 import java.util.ArrayList; public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { ...

远方其实没那么远 306

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

剑指offer:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的 思路3 > 思路2 > 思路1 首先,递增数列有个规律,如果两个数和相同而要乘积小,则两个数一定是在两边的,如 -2,-1,0,1,2,3,4,5  (-,2,2) 和 (-1,1)和都为0,但是前者乘积更小。 思路1:有连个元素,s1 和 s2.假

u013686654的博客 1102

剑指offer:和为S的两个数字——扩展

题目: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 要点: 1、递增排序 2、和为S 3、乘积最小,a*b=S,要使乘积最小,也就是|a-b|最大;乘积最大,也就|a-b|最小 乘积最小 方法及思路: 1、双指针min 和max: a[min]+a[max]等于sum,则找到; 如果和小于sum,则将min++; 如果和大于sum,则将max–。 class Solution { public: vector&lt

yshshx的博客 6702

剑指offer42:数组和一个数字S,输出两个数的乘积最小的

1 题目描述   输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述:   对应每个测试案例,输出两个数,小的先输出。 2 思路和方法   数组已经排好序了,设定两个指针small和big指向两端,如果两者的和大于sum,big左移,如果小于sum,small右移,一旦等于,那么同时...

AMY100727的博客 341

剑指offer第42题:和为S的两个数字

剑指offer第42题:和为S的两个数字题目描述和为S的两个数字源码 题目描述 和为S的两个数字 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。 源码 class Solution { public: vector<int> FindNum...

可爱的小腊肉 201

剑指offer之和为S的两个数字

剑指offer之和为S的两个数字题目描述输出描述解题思路Code 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述 对应每个测试案例,输出两个数,小的先输出。 解题思路 Two pointers的思想 Code class Solution { public: vector&lt;int...

gq__97的博客 450

《剑指Offer》Java刷题 NO.42 和为s的两个数字(有序数组、左右夹逼、多指针移动)

《剑指Offer》Java刷题 NO.42 和为s的两个数字(有序数组、左右夹逼、多指针移动) 传送门:《剑指Offer刷题总目录》 时间:2020-06-26 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。 思路: 左右夹逼,双指针移动 left开头,right指向结尾,tempSum=left+right 如果tempSum小于sum,说明太小了

qq_39618369的博客 232

剑指offer- 和为S的两个数字

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class Solution { public ArrayList&l...

六月二十七的博客 219

剑指offer 和为s的两个数

剑指offer题型分类及各题的代码及解题思路 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。 分析: 数列满足递增,设两个头尾两个指针i和j, 若ai + aj == sum,就是答案(相差越远乘积越小) 若ai + aj > ...

请叫我皮皮虾的博客 177

剑指offer-例题 和为S的两个数字

题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 返回值描述: 对应每个测试案例,输出两个数,小的先输出。 我的解法: import java.util.ArrayList; public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { Array

qq_39622795的博客 716
下一篇: 剑指offer——和为S的连续正数数列
mkfka
博客等级 码龄11年 13粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值