**
1.构建乘积数组
**
思路分析:
B数组中元素B[i]等于A数组中所以元素之积除以A[i],但题目要求不能使用除法。
所以最直观的思路就是以A[i]为界限,左边元素相乘,右边元素相乘,最后得到B数组。
代码实现:
#include <stdio.h>
#define N 5 //定义数组长度
int main(void)
{
int i,j;
int A[N],B[N];
//初始化数组A,B
for(i=0;i<N;i++)
{
B[i]=1;
printf("input value:\n");
scanf("%d",&A[i]);
}
//A[i]左边元素乘积赋值给B[i]
for(i=0;i<N;i++)
for(j=i-1;j>=0;j--)
B[i]*=A[j];
//A[i]右边元素与B[i]相乘并赋值给B[i]
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
B[i]*=A[j];
//输出B[N]
for(i=0;i<N;i++)
printf("B[%d]=%d\n",i,B[i]);
return 0;
}
时间复杂度为O(n^3)
2.数组中重复的数字
思路分析:
从第一个元素起,判断其余每一个元素与该元素是否相等;
若第一个元素无重复,则从第三个元素起找与第二个元素重复的元素,以此类推;
每个元素都只需要与后面的元素作比较
代码实现:
#include <stdio.h>
#define N 10
int main()
{
int i,j;
int A[N];
//输入数组元素
for(i=0;i<N;i++)
{
printf("Input A[%d]:\n",i);
scanf("%d",&A[i]);
}
//找出第一个重复数字
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
if(A[i]==A[j])
{
printf("%d\n",A[i]);
return 0;
}
printf("There are no duplicate numbers\n ");//没有重复数字
return 0;
}
最好情况下时间复杂度为O(1),最坏情况为O(n^2)
3.二维数组中的查找
思路分析:
- 首先是二维数组的创建,根据输入的行列数申请对应的空间;
- 之后给数组中每个元素赋值;
- 查找数组中是否有该整数:
①最直接的思路是遍历每一个元素,但该方法耗时且没有使用到题目中定义的有序数组的特点,时间复杂度为O(n^2)
②根据数组有序性的特点,先比较第一行最后一列的值,然后根据比较结果,一次可以丢掉一行或者一列。时间复杂度为O(n)
代码实现:
输入的第一行为两个整数r和c:代表将要输入的矩阵的行数和列数。
输入的第二行包括一个整数num:代表要查找的数字。
接下来的r行,每行有c个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
输出:
对应每个测试案例,
输出”Yes”代表在二维数组中找到了数字t。
输出”No”代表在二维数组中没有找到数字t。
样例输入:
3 3
5
1 2 3
4 5 6
7 8 9
样例输出:
Yes
法一:
#include <stdio.h>
#include <stdlib.h>
int num,r,c,i,j;//num要查找的数字;r行;c列
int *array;
//查找函数:暴力法,遍历每一个元素
int Find(int n)
{
int i,j;
for(i=0;i<r;i++)
for(j=0;j<c;j++)
if(*(array+i*c+j)==num)
return 1;
return 0;
}
int main()
{
printf("input row and column:\n");
while(scanf("%d%d",&r,&c)!=EOF)
{
printf("input num:\n");
scanf("%d",&num);
array=(int *)malloc(r*c*sizeof(int));
if(array==NULL)
{
printf("Out of memory!!!\n ");
return -1;
}
printf("input array num:\n");
for(i=0;i<r;i++)
for(j=0;j<c;j++)
scanf("%d",array+i*c+j);
if(Find(num)==1)
printf("Yes\n");
else
printf("No\n");
free(array);
array=NULL;
}
return 0;
}
法二:
在这里插入代码片