当前位置: 首页 > news >正文

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

目录

1 问题描述

2 解决方案

2.1 排序夹逼法

 


1 问题描述

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

 


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

 

转载于:https://www.cnblogs.com/liuzhen1995/p/6416761.html

相关文章:

  • HttpURLConnection getContentLength();返回时-1或者是0
  • 编辑器
  • SUSE Linux 11架设Apache虚拟主机
  • PCL点云库在VS2010下的编译环境配置
  • MapReduce机制
  • json反序列化成实体存入数据库
  • C/C++自实现的函数(memset, memcpy, atoi)
  • yii2之创建管理员
  • 使用Hive Rest API 连接HDInsight
  • oracle 批量改temp/data/redo file的路径
  • MAPZONE GIS SDK接入Openlayers3之三——瓦片数据集接入
  • php学习1
  • 机器学习之线性回归---logistic回归---softmax回归
  • php导出pdf
  • 10第十一天JDBC事务控制管理
  • [PHP内核探索]PHP中的哈希表
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • export和import的用法总结
  • Mysql数据库的条件查询语句
  • nginx 负载服务器优化
  • Python中eval与exec的使用及区别
  • Redis的resp协议
  • vue-router的history模式发布配置
  • 解决iview多表头动态更改列元素发生的错误
  • 前端面试之CSS3新特性
  • 前嗅ForeSpider采集配置界面介绍
  • HanLP分词命名实体提取详解
  • 通过调用文摘列表API获取文摘
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #define与typedef区别
  • #if 1...#endif
  • (1)虚拟机的安装与使用,linux系统安装
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C语言)字符分类函数
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十六)一篇文章学会Java的常用API
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET CLR Hosting 简介
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • @RequestMapping处理请求异常
  • @Service注解让spring找到你的Service bean
  • []T 还是 []*T, 这是一个问题
  • [ACM] hdu 1201 18岁生日
  • [AIGC codze] Kafka 的 rebalance 机制
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [C语言]——内存函数
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  • [JS]数据类型