以下是我写的代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int lastRemaining(int n) {
int *p;
p = (int*)malloc(sizeof(int)*n);
int result = 0;
int nn = n - 1;
for (int i = 0; i < n; i++)
{
p[i] = i + 1;
}
int ii = 1;
while (true)
{
int i = 0;
while (p[i] == 0)
{
i++;
}
while (i <= n - 1)
{
p[i] = 0;
i += pow(2, ii);
}
ii++;
while (p[result] == 0)
{
result++;
}
while (p[nn] == 0)
{
nn--;
}
if (result == nn)
{
break;
}
result = 0;
nn = n - 1;
i = n - 1;
while (p[i] == 0)
{
i--;
}
while (i >= 0)
{
p[i] = 0;
i -= pow(2, ii);
}
ii++;
while (p[result] == 0)
{
result++;
}
while (p[nn] == 0)
{
nn--;
}
if (result == nn)
{
break;
}
result = 0;
nn = n - 1;
}
return p[result];
}
int main() {
printf("%d", lastRemaining(100));
}
以下是大神写的代码:
#include<stdio.h>
int lastRemaining(int n) {
return n == 1 ? 1 : 2 * (1 + n / 2 - lastRemaining(n / 2));
}
int main() {
printf("%d", lastRemaining(100));
}
不对比就永远不知道为什么别人的工资是你的几倍。
虽然两段代码都可以解决问题,但是一眼就可以看出来哪个算法更优。我写的代码时间复杂度为O(n^n),大神的复杂度是O(n),这种差异在数特别大的时候尤其明显。
没有最好的程序员,但有最好的算法。
还是要努力啊。