Java 找出两个在O(n)时间内相乘为20的数字
我试着在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++) {
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;i20/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)
复杂度。