删除有序数组中的重复项 返回最终数组长度
int al1(int* a,int len)
{
int i = 0;
for (int j = 1; j < len; j++)
{
if (a[i] != a[j])
{
i++;
a[i] = a[j];
}
}
return i+1;
}
找到数组的中心下标 左边和=右边和
方法一
int al2(int* a, int len)
{
int sum = 0;
for (int i = 0; i < len; i++)
{
sum += a[i];
}
int sum2 = 0;
for (int i = 0; i < len; i++)
{
sum2 += a[i];
if (sum2 == sum)
{
return i;
}
sum -= a[i];
}
}
方法二
int al2_2(int* a, int len)
{
int sum = 0;
for (int i = 0; i < len; i++)
{
sum += a[i];
}
int sum2 = 0;
for (int i = 0; i < len; i++)
{
if (2 * sum2 + a[i] == sum)
{
return i;
}
sum2 += a[i];
}
}
二分查找(线性表采用顺序存储结构,且是有序数列)
int efcz(int* num, int len,int tag)
{
int z1 = 0, z2 = len - 1;
int index = -1;
while (z1 < z2-1)
{
int x = z1 + (z2 - z1) / 2;
if (num[x] < tag)
{
z1 = x;
}
else if (num[x] > tag)
{
z2 = x;
}
else if(num[x] == tag)
{
index = x;
break;
}
//cout << z1 << z2;
}
return index;
}
斐波那契数列
int fbnq(int num)
{
if (num >= 2)
{
return fbnq(num-1) + fbnq(num-2);
}
if (num == 1) return 1;
if (num == 0) return 0;
}
时间复杂度 O(2^n)
空间复杂度 O(n)
优化
int fbnq1(int* a, int* b, int num)
{
*a = 0;
*b = 1;
for (int i = 2; i <= num; i++)
{
int* c = b + 1;
*c = *a + *b;
a = b;
b = c;
}
return *b;
}
时间复杂度 O(n)
空间复杂度 O(1)