Java 找出两个在O(n)时间内相乘为20的数字

Java 找出两个在O(n)时间内相乘为20的数字,java,algorithm,time-complexity,Java,Algorithm,Time Complexity,我试着在O(n)时间内得到两个乘以20的数字。正在尝试在此处使用哈希映射 我的测试用例是 intarr[]={2,4,1,6,5,40,-1} 它给了我数组索引1和5,而它应该是1和4 public static int[] multToTwenty(int arr[]) { HashMap<Integer, Integer> hm = new HashMap<>(); for (int i = 0; i < arr.length; i++) {

我试着在O(n)时间内得到两个乘以20的数字。正在尝试在此处使用哈希映射

我的测试用例是
intarr[]={2,4,1,6,5,40,-1}

它给了我数组索引1和5,而它应该是1和4

public static int[] multToTwenty(int arr[]) {

    HashMap<Integer, Integer> hm = new HashMap<>();

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

        if (hm.containsKey(20 / arr[i])) {
            return new int[]{hm.get(20 / arr[i]), arr[i]};
        }
        hm.put(arr[i], i);
    }
    return new int[]{-1, -1}; // Nothing found
}
public static int[]multtotototown(int arr[]){
HashMap hm=新的HashMap();
对于(int i=0;i
20/i
是一个整数除法,因此
j=20/i
并不意味着
i*j==20
。您需要添加额外的检查:

if (20 % arr[i] == 0 && hm.containsKey(20 / arr[i]))
代码中还有另一个错误:返回元素
a[i]
,而不是索引
i
。你需要回来

new int[]{hm.get(20 / arr[i]), i};

HashMap
s不能保证在O(1)中工作,这里
returnnewint[]{hm.get(20/arr[i]),}返回数组中位置4处的值,即5。如果要返回索引,请将
arr[i]
更改为
i
。投票以键入方式结束。
hm.get(20/arr[i])
返回数组中数字的索引
20/arr[i]
,而
arr[i]
返回(第二个)数字,因此基本上是返回一个索引和一个数字,而不是返回两个索引或两个数字。你想返回其中哪一个?对我来说,使用散列图似乎太过分了。您只需在列表中查找20(1、2、4、5、10和20)的因子即可。每当你找到一个,检查是否已经找到了相应的值(20、10、5、4、2或1)。是的,但我不认为这就是他得到这个特定结果的原因。谢谢。我对20%的arr部分有点困惑。你能给我举一个例子,如果不包括它,我会得到错误的答案吗?@user2411290,假设你的
arr
{2,9}
20/9==2
,但
2*9
不等于
20
。感谢您的澄清。我真的很感谢你的帮助@user2411290,不客气!不要忘记,
HashMap
具有
O(1)
put/get/平均复杂度,而不是在最坏的情况下(尽管不是很现实)。严格地说,该算法只有在一般情况下才具有
O(n)
复杂度。