我有一项任务,我需要扫描一些案例。在每种情况下,您都会获得一个数组和一个目标。目标是扫描数组以找到一组两个加起来的数字。
我的问题是我需要让我的大哦(运行时间)等于n,这意味着我最多只能有一个循环。这是我现在的代码。
//Assume that cases, sizeofarray, array, and target already exist.
while(cases =! 0){
scanf("%d", @sizeofarray);
scanf("%d", @target);
array = malloc(sizeof(int) * sizeofarray);
}
正如您所看到的,为多个案例运行的要求已经消除了我在函数中使用其他循环的能力。因此,我需要扫描并比较数组中的值而不使用for循环。
我认为另一种选择是不使用case值循环,从而使我能够在其他地方使用循环并将我的运行时间保持在n以下。
如果有人可以帮助我,我将不胜感激。重申一下,我需要知道是否存在一种技术,可以在没有循环的情况下将值扫描到数组中,用于比较数组中的值而不进行循环,或者用于扫描多个没有循环的情况。
答案 0 :(得分:1)
这是一个经典的两和问题。使用HashMap存储目标值。我提供了一个Java示例供您参考。我认为它可以很容易地转换为C ++代码
public class Solution {
public int[] twoSum(int[] numbers, int target) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
int[] result = new int[2];
for (int i = 0; i < numbers.length; i++) {
if (map.containsKey(numbers[i])) {
int index = map.get(numbers[i]);
result[0] = index+1 ;
result[1] = i+1;
break;
} else {
map.put(target - numbers[i], i);
}
}
return result;
}
}
时间复杂度取决于HashMap的put和get操作,通常是O(1)。
此解决方案的时间复杂度为O(n)。