zoukankan      html  css  js  c++  java
  • java实现和为定值的两个数

    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("
    数组中元素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
    
  • 相关阅读:
    MSCRM 2011 修改显示记录数
    医疗相关名词解析
    把图片中的文字转成文本
    自我介绍吧
    第三次作业
    第一次作业心得
    耿丹161第一次作业
    第二次作业
    C#常用函数表及Asp.net(C#)常用函数表
    C语言I博客作业02
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13078440.html
Copyright © 2011-2022 走看看