java - 在 Java 中计算与目标总和对应的数组索引的代码优化空间是否存在?

标签 java arrays algorithm optimization

这是我的代码,用于获取其值的总和对应于给定目标值的数组的索引。目前在最坏的情况下是 O(N2) 算法。有什么改进方法吗?

public class SumArrayTarget {

public static void main(String[] args) {
        int[] arr = { 1, 2, 4, 6, 3, 5, 7 };
        System.out.println("The indices are "+ Arrays.toString(sum(arr, 12)));
    }

    public static int[] sum(int[] arr, int target) {
        int[] list = new int[2];
        for (int i = 0; i < arr.length - 1; i++) {
            int j = i+1;
            while (j < arr.length) {
                if (arr[i] + arr[j++] == target){
                    list[0]=i;
                    list[1]=j-1;
                    return list;
                }
            }
        }
        return list;
    }
}

最佳答案

您的算法假设总有两个数字加起来达到所需的目标。如果没有,则返回一个空的索引列表 {0,0}。如果这是您需要的行为,那么我可以想到一种复杂性改进:

  • 将您的输入数组放入 LinkedHashMap,将数字映射为键,将其索引映射为值。花费 O(n) 时间。
  • 遍历 map 。对于具有键 n 的每个项目:
    • 查看 map 中是否存在具有键 target - n 的元素,如果存在,则返回一个包含两个键的数组。每个元素花费预期的 O(1) 时间。
  • 如果 map 的所有元素都没有相应的答案,则返回 null 或其他内容以指示没有可能的答案。

这使算法的总运行时间达到了预期的 O(n),但开销非常大。对于小于一百万的输入数组,您的蛮力方法可能更好。

如果您尝试回答的问题也允许两个以上的索引作为结果,那么您就遇到了整数背包问题。你可以谷歌一下,但它会变得更加复杂!

编辑:添加示例实现。

public static int[] sum(int[] arr,int target) {
    LinkedHashMap<Integer,Integer> map = new LinkedHashMap<Integer>(arr.length);
    for(i = 0;i < arr.length;i++) {
        map.add(arr[i],i);
    }
    for(Map.Entry<Integer,Integer> entry : map.entrySet()) {
        int n = entry.getValue();
        int index = entry.getKey();
        if(map.containsKey(target - n)) {
            return new int[] {index,map.get(target - n)};
        }
    }
    return null;
}

关于java - 在 Java 中计算与目标总和对应的数组索引的代码优化空间是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18523636/

相关文章:

java - Scala 等价于 Java 的静态 block 是什么?

java - 套接字始终打开还是仅在需要时打开?

javascript - 在 React 中渲染 wordcloud

java - 如何在java上生成随机唯一数字

algorithm - OpenCV线拟合算法

java - 当我尝试读取通过 Intent 传递的 Vector 时出现 NullPointerException

java - 为什么对象类方法以类的实例作为参数

javascript - 我对javascript中多维数组的理解是否正确?

algorithm - 从两组中选择具有相同权重的项目

algorithm - 链表的时间复杂度是多少