Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在一个数组中找到两个相乘到某个数字的值_Java_Arrays_Numbers_Compare_Multiplication - Fatal编程技术网

Java 如何在一个数组中找到两个相乘到某个数字的值

Java 如何在一个数组中找到两个相乘到某个数字的值,java,arrays,numbers,compare,multiplication,Java,Arrays,Numbers,Compare,Multiplication,我要做的是搜索一个数组,找出是否有两个数字相乘到225。以下是我现在拥有的: int n = A.length; for(int i = 0; i >= n; i++){ for(int j = 0; j >= n; j++){ if(i == j){ } else if(A[i] * A[j] == 225){ return true;

我要做的是搜索一个数组,找出是否有两个数字相乘到225。以下是我现在拥有的:

    int n = A.length;

    for(int i = 0; i >= n; i++){
        for(int j = 0; j >= n; j++){
            if(i == j){
            }
            else if(A[i] * A[j] == 225){
                return true;
            }
        }
    }
    return false;
}

它会找到数组中的第一个值,并将其与其他值相乘,一旦找到两个225的数字,则返回true。我也这样做,如果I和j是相同的数字,那么它什么也不做,因为我不希望它比较相同位置的值。问题是,即使在两个数相乘为225的数组中(如15、45、60、15),它也会不断返回false。那么我的代码出了什么问题

for循环有1个问题:

应该是这样的:

int n = A.length;
for(int i = 0; i < n; i++)
    for(int j = 0; j < n; j++)
        if(i != j)
            if(A[i] * A[j] == 225)
                return true;
int n=A.length;
对于(int i=0;i
此外,您可以稍微优化此循环,以:

int n = A.length;
for(int i = 0; i < (n-1); i++)
    for(int j = (i+1); j < n; j++)
        if (A[i] * A[j] == 225)
            return true;
int n=A.length;
对于(int i=0;i<(n-1);i++)
对于(int j=(i+1);j
这是一个稍微不同的版本,它的平均复杂度为O(N):

final Map set=新的HashMap(A.length);
对于(最终int i:A){
set.put(i,set.containsKey(i));//存储数组中的数字,如果两个数字多次出现,则设置为true
}
对于(最终int i:A){
最终整数倍数=225/i;
如果((mult*i)=225){//测试整数乘法导致225
最终布尔值m=set.get(mult);
如果(m!=null){//我们在集合中有两个数字,现在我们应该过滤重复计数
if((i!=mult)| |((i==mult)和&m.booleanValue())
返回true;
}
}
}
返回false;
这里是数组。sort()在内部使用快速排序

public class FindMultiplicationValueUsingpointer 
{
    private void operation(int [] arr, int required)
    {//2, 3, 4, 5, 6, 7
        Arrays.sort(arr);
        int right =arr.length-1;
        int left= 0, val;

            while(left<right)
            {
                System.out.println("left is "+arr[left]);
                System.out.println("right is "+arr[right]);
                val = arr[left]*arr[right];
                System.out.println("value is " +val);
                if(val<required)
                {
                    left = left+1;

                }
                else if(val>required)
                {
                    right=right-1;
                }

                else if(val==required)
                {
                    System.out.println("value matched");
                    break;

                }
            }   

    }

    public static void main(String[] args) 
    {
        int arr[] = {3, 2, 6, 7, 4, 5};
        int required = 20;
        FindMultiplicationValueUsingpointer  up = new FindMultiplicationValueUsingpointer();
        up.operation(arr, required);

    }
公共类使用指针查找多应用程序值
{
私有无效操作(int[]arr,需要int)
{//2, 3, 4, 5, 6, 7
数组。排序(arr);
int right=arr.length-1;
int left=0,val;

而(左也可以使用hashset对任何数字执行一个for循环,这也将最小化迭代次数。最佳情况为o(1),最坏情况为o(n):

public boolean hasAnyPair(int[]arr,int n){
布尔hasPair=false;
HashSet=newhashset();
对于(int i=0;i=arr[i]&&n%arr[i]==0){
集合。添加(arr[i]);
if(集合包含(n/arr[i])){
hasPair=true;
打破
}
}
}
返回hasPair;
}

我的原始算法的运行时间是O(n^2)。优化循环的运行时间是多少?@JoshSusa复杂度是相同的O(n^2),但实际运行时间是(n^2)/2是否可以将运行时间设为O(n)或O(nlogn)?
public class FindMultiplicationValueUsingpointer 
{
    private void operation(int [] arr, int required)
    {//2, 3, 4, 5, 6, 7
        Arrays.sort(arr);
        int right =arr.length-1;
        int left= 0, val;

            while(left<right)
            {
                System.out.println("left is "+arr[left]);
                System.out.println("right is "+arr[right]);
                val = arr[left]*arr[right];
                System.out.println("value is " +val);
                if(val<required)
                {
                    left = left+1;

                }
                else if(val>required)
                {
                    right=right-1;
                }

                else if(val==required)
                {
                    System.out.println("value matched");
                    break;

                }
            }   

    }

    public static void main(String[] args) 
    {
        int arr[] = {3, 2, 6, 7, 4, 5};
        int required = 20;
        FindMultiplicationValueUsingpointer  up = new FindMultiplicationValueUsingpointer();
        up.operation(arr, required);

    }
   public boolean  hasAnyPair(int[] arr, int n) {


        boolean hasPair=false;
        HashSet<Integer> set= new HashSet<Integer>();

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

            if(n>=arr[i] && n%arr[i]==0) {
                set.add(arr[i]);
                if(set.contains(n/arr[i])) {
                    hasPair=true;
                    break;
                }
            }

        }

        return hasPair;

    }