加扰数组 – 检查数组中的元素是否与O(n)复杂度匹配(顺序无关紧要)
我正在尝试编写带有两个数组的代码,如果元素匹配(顺序无关紧要)则返回1,如果它们不匹配则返回0。
- 必须是O(n)
我写了几个不同的算法,一个比较两个数组的总和,如果它们是相同的则返回1,如果它们不是,则为0,但如果数组包含总结为相同的数据的不同值元素,那么这不是工作。
找到一个O(n ^ 2)很简单(两个循环,比较,然后迭代A等的下一个位置..
我似乎无法找出这样做的O(n)。 我当前的代码取值的差异,如果它的0返回1仍然不知道如何处理不排序相同的乱序数组。 是否有O(n)这样做?
int scrambled( unsigned int a[], unsigned int b[], unsigned int len) { int count[100]; int flag = 1; int i; for(i=0; i<100; i++){ count[i] = 0; } for(i=0; i<len; i++){ count[a[i]]++; count[b[i]]--; } for(i=0; i<100; i++){ if(count[i] != 0){ return 0; } } return flag;
如果你可以使用C ++ 11,可以在O(n)
时间内填充std::unordered_set
然后你可以执行O(n)
元素成员资格测试(即使你做了两次它仍然是O(n)
;常数乘数不要算)。
如果C ++ 11已经用完,你仍然可以使用与手写哈希集相同的基本算法,或者如果每个元素都在有界范围内,你可以使用计数排序 (即O(n+k)
由于专注于数字范围,如果范围很小, k
分量并不重要)。