剑指offer——数组总结

**web

1.构建乘积数组

**
在这里插入图片描述数组

思路分析:
B数组中元素B[i]等于A数组中因此元素之积除以A[i],但题目要求不能使用除法。
因此最直观的思路就是以A[i]为界限,左边元素相乘,右边元素相乘,最后获得B数组。svg

代码实现:函数

#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.数组中重复的数字

在这里插入图片描述

思路分析:
从第一个元素起,判断其他每个元素与该元素是否相等;
若第一个元素无重复,则从第三个元素起找与第二个元素重复的元素,以此类推;
每一个元素都只须要与后面的元素做比较spa

代码实现:code

#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)xml

3.二维数组中的查找

在这里插入图片描述

思路分析:blog

  • 首先是二维数组的建立,根据输入的行列数申请对应的空间;
  • 以后给数组中每一个元素赋值;
  • 查找数组中是否有该整数:
    ①最直接的思路是遍历每个元素,但该方法耗时且没有使用到题目中定义的有序数组的特色,时间复杂度为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;
}

法二:

在这里插入代码片