如何在数组中显示最接近的对产品

时间:2018-06-16 15:41:24

标签: java

import java.util.Scanner;
class my
{
    public static void main()
    {
        Scanner sc = new Scanner(System.in);
        int t;
        int a[] = new int[5];
        int l = a.length;
        int prod[] = new int[100];
        int index[] = new int[100];
        int n;
         System.out.println("enter a elements into array ");
         for(int i = 0;i<5;i++)
         {
             a[i] = sc.nextInt();
         }
         for(int i = 0 ;i<4;i++)
         {
             for(int j = 0;j<(4-i);j++)
             {
                 if(a[j]>a[j+1])
                 {
                     t = a[j];
                     a[j] = a[j+1];
                     a[j+1] = t;
                    }
             }
         }
        System.out.println("enter a number");
        n = sc.nextInt();

        for(int i = 0;i<l-1;i++)
        {
            prod[i] = a[i]*a[i+1];
            index[i] = a[i];
            index[i+1]=a[i+1];
        }
        for(int i = 0;i<l;i++)
        {
            if(prod[i]!=0)
           System.out.println(prod[i]);

        }

        for(int i = 0;i<l-1;i++)
        {
            if(n>prod[i]&&n<=prod[i+1])
            System.out.println(index[i+1]+"\t"+index[i+2]); 

        }
    }
}

如果要在数组中显示最接近的对产品,该产品最接近输入的数字。但是当我输入数组元素1,2,3,5,4时 进入数组后,我输入数字8,显示3,4对数组而不是5,2。答案是5,2,因为5 * 2的乘积是10,最接近输入的数字是8。

2 个答案:

答案 0 :(得分:1)

代码的问题在于它只是计算两个连续元素的乘积,而不是简单地将它与其他元素的乘积进行比较,这不是正确的方法。

由于您对数组进行排序,因此使用二进制搜索的逻辑更好的方法。并且最接近x的对的乘积具有最小差异的逻辑。

您可以使用的算法如下:

1. Make a variable difference and initialize to Integer.MAX_VALUE;
2. Now traverse the array from both the direction, i.e set index of left = 0, and right = arr.length -1.
3. Loop while left < right.
   (a) If  abs((arr[left] * arr[right]) - x) < difference  
       then update difference and result 
   (b) if((arr[left] * arr[right]) <  x)  then
       left++
   (c) Else right--
  

时间复杂度:O(nlog(n))

答案 1 :(得分:0)

我不明白为什么你的解决方案中有如此多的循环和如此多的变量。您也不需要对数组a进行排序。

在伪代码中:

var a[]
var n
var closest = MAX_INTEGER
var closest_i
var closest_j

for i in range [0, a.length)
    for j in range [i + 1, a.length)
        var distance = abs(a[i] * a[j] - n)
        if distance < closest
            closest = distance
            closest_i = i
            closest_j = j

请注意,这会有O(n)时间复杂度。