【发布时间】:2018-08-23 14:25:20
【问题描述】:
我正在处理一个 Codility 问题:
给定两个非空的零索引数组 A 和 B,包括 N 个整数。数组 A 和 B 代表河流中的 N 条贪婪的鱼, 顺着河流顺流而下。
鱼从 0 到 N - 1 编号。如果 P 和 Q 是两条鱼并且 P
鱼数P用A[P]和B[P]表示。数组 A 包含 鱼的大小。它的所有元素都是独一无二的。数组 B 包含 鱼的方向。它仅包含 0 和/或 1,其中:
0代表一条鱼在上游,1代表一条鱼在上游 下游。如果两条鱼朝相反的方向移动并且没有 他们之间的其他(活)鱼,他们最终会相遇 其他。那么只有一条鱼可以活着——大鱼吃掉了 较小的一个。更准确地说,我们说两条鱼 P 和 Q 相遇 其他当 P
如果 A[P] > A[Q] 那么 P 吃掉 Q,P 仍然会顺流而下, 如果 A[Q] > A[P] 则 Q 吃掉 P,Q 仍将向上游流动。我们 假设所有的鱼都以相同的速度流动。也就是鱼 朝着同一个方向前进,永远不会相遇。目标是计算 能存活的鱼的数量。
**Complexity:**
预期的最坏情况时间复杂度为 O(N); 预期的最坏情况空间复杂度为 O(N),超出输入存储(不计算输入参数所需的存储)。
这是我的解决方案:(100% 正确的结果)
public int solution(int[] a, int[] b) {
int remFish = a.length;
int i = 0;
for (i = 0; i < b.length; i++) {
if(b[i] != 0){
/*remFish++; }else { */ break;
}
}
Stack<Integer> myQ = new Stack<Integer>();
for (int j = i; j < b.length; j++) {
if(b[j] == 1)
{
myQ.add(j);
}
while(b[j] == 0 && !myQ.isEmpty()) {
if(a[j] > a[myQ.peek()]){
myQ.pop(); remFish--;
}else{
remFish--;
break;
}
}
}
return remFish;
}
有人可以帮助我了解我的解决方案是否通过了复杂性要求吗?
【问题讨论】:
标签: java algorithm performance time-complexity space-complexity