用O(n)求解子集中三重乘积的最小值和最大值的算法

时间:2014-10-28 02:53:02

标签: java algorithm recursion time-complexity

问题是找到可以形成的最小和最大三重产品(3个数字的乘积),给定一组数字。我设法编写了一个完美的代码,但它具有复杂性(N^2)。如果可能的话,我需要帮助将它减少到O(N)

编辑:数字可以是正数也可以是负数。

这是我的代码:

import java.util.*;

class Result {

    public static int min =50000000;
    public static int max =-50000000;

    public static int solve(int pos, int currPro, int depth) {
            if (depth==3){
                check(currPro);
            }
            else {
                for (int i=1; i<=Triplet.data.length-pos; i++){
                if(pos+i < Triplet.data.length){
                    solve(pos+i,currPro*Triplet.data[pos+i],depth+1); 
                }
            }
        }
        return 0;
    }

    public static void check(int currPro) {
        if (currPro > max){
            max = currPro;
        }

        if (currPro < min){
            min = currPro;
        }
    }
}

class Triplet {

    static int[] data;

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt(); //Number of int
        data = new int[num];
        for (int i=0;i<num;i++){
            data[i] = sc.nextInt();
        }
        if (num==3){
            int result= data[0]*data[1]*data[2];
            System.out.println(""+result+" "+result);
        }
        else{
            Result.solve(-1, 1, 0);
            System.out.println(""+Result.min+" "+Result.max);
        }
    }
}

1 个答案:

答案 0 :(得分:4)

试试这个

  1. 在O(N)时间内快速排序分区找到三个最小和三个最大数字(无论是负数还是正数)。
  2. 将您的O(N ^ 2)溶液应用于6个数字的数组。
  3. 运行时间 - O(N)