我对2-sum的解决方案很慢?

时间:2013-04-11 01:19:47

标签: java algorithm performance

我正在研究2-sum问题,我认为我的解决方案非常有效,但在我运行之后,该程序显然花了太长时间。这是我的代码:

  public int[] twoSum(int[] numbers, int target) {
        int [] original = new int[numbers.length];
        for(int i=0; i<numbers.length; i++){
            original[i] = numbers[i];
        }
        Arrays.sort(numbers);
        int [] returnArray = new int[2];
        int left = 0;
        int right = numbers.length-1;
        int found1 = 0, found2 = 0;
        int index1 = 1, index2 = numbers.length-1;
        for (;left<right;){
            if(numbers[left] + numbers[right] == target){
                found1 = numbers[left];
                found2 = numbers[right];
                break;
            }
            else if(numbers[left] + numbers[right] < target){
                left++;
            }
            else{
                right--;
            }
        }
        for(;index1<index2;){
            if(original[index1] == found1){
                returnArray[0] = index1+1;
            }
            else{
                index1 ++;
            }
            if(original[index2] == found2){
                returnArray[1] = index2+1;
            }
            else{
                index2 --;
            }

        }
        return returnArray;
    }

问题表明

  

您可以假设每个输入都只有一个解决方案。函数twoSum应返回两个数字的索引,以便它们加起来到目标,其中index1必须小于index2。请注意,您返回的答案(index1和index2)不是从零开始的。

我的想法是先对数组进行排序,然后找到这两个元素,然后是两个索引。我认为有必要先存储原始数组,因为排序会改变数组。我解决方案的哪一部分很慢?

P.S。我不经常使用Java,随意指出我的错误。

感谢。

1 个答案:

答案 0 :(得分:0)

你在这里有两个通行证。一个用于查找数字,另一个用于记住原始索引。

如果您首先保留了索引,则可以避免第二次传递。

从包含i..e {1,2,3,4,...}的索引的数组开始,然后使用非默认比较器对其进行排序:

sort(T[] a, Comparator<? super T> c)

让比较器使用原始数组中的值对索引进行排序。

然后在索引上运行你的二和,你已经有了索引值。