Это более или менее там, но не совсем. В большинстве случаев это O (n), но O (n ^ 2), если каждый ticketNum больше, чем каждый winnerNum. (Это потому, что внутренний цикл j
не break
, когда j==6
, как следует, а вместо этого запускает следующую i
итерацию.)
Вы хотите, чтобы ваш алгоритм увеличивал значение i
или j
на каждом шаге и завершал работу, когда i==6
или j==6
. [Ваш алгоритм почти удовлетворяет этому, как указано выше.] В результате вам нужен только один цикл:
for (i=0,j=0; i<6 && j<6; /* no increment step here */) {
if (ticketNum[i] == winningNum[j]) {
numMatches++;
i++;
j++;
}
else if (ticketNum[i] < winningNum[j]) {
/* ticketNum[i] won't match any winningNum, discard it */
i++;
}
else { /* ticketNum[i] > winningNum[j] */
/* discard winningNum[j] similarly */
j++;
}
}
Ясно, что это O (n); на каждом этапе он либо увеличивает i
, либо j
, поэтому большинство шагов, которые он может сделать, это 2 * n-1. Это поведение почти такое же, как у вашего алгоритма, но его легче отслеживать и легче увидеть, что оно правильное.