java 寻找和为定值的多个数_算法笔记_037:寻找和为定值的两个数(Java)

该博客介绍了如何使用Java解决寻找数组中和为定值的两个数的问题。通过合并排序数组,然后使用双指针从两端向中间遍历,一旦找到和为目标值的数对,就输出并结束遍历。提供了具体的代码实现和示例。
摘要由CSDN通过智能技术生成

1 问题描述

输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数。如果有多对数的和等于输入的整数,输出任意一对即可。例如,如果输入数组[1,2,4,5,7,11,15]和整数15,那么由于4+11 = 15,因此输出4和11。

2 解决方案

2.1 排序夹逼法

首先将整数数组,使用合并排序进行从小打到的排序,然后对这个排完序的数组从两头往中间遍历,一旦出现两个数的和等于输入的那个整数,则立即输出这两个数,并结束遍历。

具体代码如下:

package com.liuzhen.array_2;

public class TwoSumN {

/*

* 参数A:给定的一个从小到大排序的数组

* 参数n:待求和数n

* 函数功能:打印出A中两个元素,满足A[i]+A[j] = n

*/

public void getTwoSumN(int[] A,int n){

int start = 0;

int end = A.length - 1;

while(start < end){

if(A[start] + A[end] == n){

System.out.println("\n数组中元素A["+start+"]" +

" + A["+end+"] = "+n+",A["+start+"] = "+A[start]+",A["+end+"] = "+A[end]);

break;

}

else{

if(A[start] + A[end] > n)

end--;

else

start++;

}

}

}

//归并排序

public void mergeSort(int[] A){

if(A.length > 1){

int[] leftA = getHalfArray(A,0); //数组A的左半部分

int[] rightA = getHalfArray(A,1); //数组A的右半部分

mergeSort(leftA);

mergeSort(rightA);

getMerge(A,leftA,rightA);

}

}

/*

* 参数A:要进行折半的数组

* 参数judge:judge == 0表示返回数组A左上半部分,judge != 0表示返回数组A的右半部分

* 函数功能:把数组按照长度均分为上半部分和下半部分

*/

public int[] getHalfArray(int[] A,int judge){

int[] result;

if(judge == 0){

result = new int[A.length/2];

for(int i = 0;i < A.length/2;i++)

result[i] = A[i];

}

else{

result = new int[A.length - A.length/2];

for(int i = 0;i < A.length - A.length/2;i++)

result[i] = A[i+A.length/2];

}

return result;

}

/*

*参数A:给定待排序数组

*参数leftA:数组A的左半部分

*参数rightA:数组的右半部分

*函数功能:返回数组A的从小到大排序

*/

public void getMerge(int[] A,int[] leftA,int[] rightA){

int i = 0; //用于计算当前遍历leftA的元素个数

int j = 0; //用于计算当前遍历rightA的元素个数

int count = 0; //用于计算当前得到按从小到大排序的A的元素个数

while(i < leftA.length && j < rightA.length){

if(leftA[i] < rightA[j]){

A[count++] = leftA[i];

i++;

}

else{

A[count++] = rightA[j];

j++;

}

}

if(i < leftA.length){

while(i < leftA.length)

A[count++] = leftA[i++];

}

if(j < rightA.length){

while(j < rightA.length)

A[count++] = rightA[j++];

}

}

public static void main(String[] args){

TwoSumN test = new TwoSumN();

int[] A = {2,1,7,4,6,1,2,4,3,6,8,4,2,1,7,3,4,6,8,3,4};

test.mergeSort(A);

System.out.println("对数组A进行合并排序后结果:");

for(int i = 0;i < A.length;i++)

System.out.print(A[i]+" ");

test.getTwoSumN(A, 10);

}

}

运行结果;

对数组A进行合并排序后结果:

1 1 1 2 2 2 3 3 3 4 4 4 4 4 6 6 6 7 7 8 8

数组中元素A[3] + A[20] = 10,A[3] = 2,A[20] = 8

算法笔记&lowbar;041&colon;寻找和为定值的多个数(Java)

目录 1 问题描述 2 解决方案 1 问题描述 输入两个整数n和sum,要求从数列1,2,3,...,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来. 2 解决方案 上述问题 ...

在数组中寻找和为定值的n个数

/*-------------------------------------------------------*/ /*寻找和为定值的两个数 输入一个数组A[0,N-1]和一个数字Sum,在数组中 ...

编程之法section II&colon; 2&period;2 和为定值的两个数

====数组篇==== 2.2 求和为定值的两个数: 题目描述:有n个整数,找出其中满足两数相加为target的两个数(如果有多组满足,只需要找出其中一组),要求时间复杂度尽可能低. 解法一: 思路: ...

【Data Structure &amp&semi; Algorithm】在排序数组中查找和为定值的两个数

在排序数组中查找和为定值的两个数 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出 ...

Java实现寻找和为定值的多个数

1 问题描述 输入两个整数n和sum,要求从数列1,2,3,-,n中随意取出几个数,使得它们的和等于sum,请将其中所有可能的组合列出来. 2 解决方案 上述问题是典型的背包问题的应用,即先找出n个数 ...

【剑指offer】和为定值的两个数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/24933341 题目描写叙述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的 ...

【剑指offer学习】求和为定值的两个数(拓展)

接着上面一篇文章: http://blog.csdn.net/u013476464/article/details/40651451 接下来我们拓展一下题目,如果数组是乱序的,并且规定数组中的元素所有 ...

算法笔记&lowbar;035&colon;寻找最小的k个数(Java)

目录 1 问题描述 2 解决方案 2.1 全部排序法 2.2 部分排序法 2.3 用堆代替数组法 2.4线性选择算法   1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 ...

算法笔记&lowbar;031&colon;计算中值和选择问题(Java)

目录 1 问题描述  2 解决方案 2.1 计算中值问题 2.2 选择问题   1 问题描述 中值问题是求一个n个数列表中某一数组下标k,它要求该下标元素比列表中的一半元素大,又比另一半元素小,这个中 ...

随机推荐

ReactJS入门(四)—— 组件API

本篇将介绍 React 组件的API,其中主要的几个API我们在第一篇的时候便已介绍过,这里可以做个温故知新. 本篇的代码你也可以在我的Github上获取到. setState 参数: nextSta ...

深入理解Bootstrap笔记

框架介绍 1.框架简介 2.CSS基本语法 3.JavaScript基本语法 4.Bootstrap整体架构 5.12栅格系统 6.CSS组件架构设计思想 7.JavaScript插件架构 CSS布局 ...

iOS——Command-Line 查看当前SDK版本并修改默认SDK版本

在工作中可能会碰到用命令行编译.打包iOS应用程序的情况(xcodebuild相关命令). 但是由于SDK版本问题,会报错,说某SDK版本不对,可能是因为升级Xcode导致的SDK版本升级,为了避免高 ...

objective-c中字符串长度计算

我们知道,在c语言中,使用sizeof ()计算在内存中占用的字节数, 引用string.h后,使用strlen()计算字符串的长度(不包含\0). 而在object-c中, "length ...

Struts2 框架验证

struts2框架验证(xml方式):    * 首先要从页面中获取对应的标签name属性的值,在动作类action中声明同名的属性,提供get和set方法        * 创建一个xml格式验证文 ...

STM32串口usart发送数据

主函数请直接关注41行到47行代码!! #include "stm32f10x.h" // 相当于51单片机中的 #include #include ...

新人入坑Redis必会的吐血总结

新人入坑Redis必会的吐血总结 一.什么是Redis Redis是一个使用C语言开发的开源的高性能的key-value存储系统,我们可以把它近似理解为Java Map.简单来讲,Redis是一种NO ...

JDBC辅助类封装 及应用

一:代码图解: 二:配置文件: driverClassName=com.mysql.jdbc.Driver url=jdbc\:mysql\://127.0.0.1\:3306/xlzj_sh_new ...

Ubuntu18&period;10下运行blender2&period;80bate闪退&lpar;问题&quest;&rpar;

Ubuntu18.10下直接运行blender2.80bate闪退, 运行blender2.79正常. ================= root@tom-laptop:/# uname -aLin ...

禁用firefox 56自动更新

firefox 56支持旧式扩展,这很重要! 它却自动更新,简单地关了也不行,很是牛氓! ========== -备份C:\Users\用户名\AppData\Roaming\Mozilla\Fire ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值