我有一个未排序的数组,我想找到该数组中的所有对,以便它们的差异(绝对值)给出x。
例如,如果x = 8并且我们有数组{13,1,-8,21,0,9,-54,17,31,81,-46},我会得到: 指数0& 3的值为13& 21(例如,13-21 = | 8 |) 指数1& 5的值为1& 9 指数2& 4,值为-8& 0 指数6& 10,值为-54& -46
我做了一个解决方案,但我不确定它是O(n)还是O(n ^ 2)。我试图避免嵌套循环,而是保留两个指针i和j,但我仍然认为它是O(n ^ 2)?它有点像嵌套循环。
int i = 0;
int j = 1;
System.out.println("All pairs of elements of the array that subtract exactly to absolute value of " + x + " are:");
while (i < A.length && j < A.length)
{
if (abs(A[i] - A[j]) == x)
{
System.out.println("Indices " + i + " & " + j + " with values " + A[i] + " & " + A[j]);
}
if (j != A.length - 1)
{
j++;
} else if (i == A.length - 1)
{
return;
} else
{
i++;
j = i + 1;
}
}
答案 0 :(得分:0)
它的行为类似于嵌套循环
这不只是“有点” - 你手动编码了两个循环, j -loop逻辑上位于 i -loop内。关键部分是:
i = 0
while i < limit {
...
i += 1
}
和
j = 1
while j < limit {
...
j = i+1
}
其中每一个都是
这与if-else逻辑相结合,可以很好地转换为
for i in 0 : limit {
for j in i+1 : limit {
}
}
答案 1 :(得分:0)
import java.util。*;
公共课TwoDiff {
public static void main(String args[])
{
int arr[] = {13, 1,-8, 21, 0, 9,-54, 17, 31, 81,-46};
int target = 8;
List<int[]> res = twoDiff(arr, target);
res.forEach(l -> System.out.println(Arrays.toString(l)));
}
private static List<int[]> twoDiff(int[] arr, int target) {
Map<Integer, Integer> map = new HashMap<>();
List<int[]> resList = new ArrayList<>();
for(int i=0; i< arr.length; i++)
{
map.put(arr[i], i);
}
for (int i =0; i < arr.length; i++)
{
int complement = arr[i] - target;
if(map.containsKey(complement))
{
resList.add(new int[] {i, map.get(complement)});
}
}
return resList;
}
}