经典案例(1)
问题:无重复数字
有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
解决思路(1)
此题可以反向思考,先完成所有可能排列组合后,排除掉不满足条件的组合,余下的就是正确结果:
- 准备数据 ,建立一个数组,赋予1,2,3,4组合元素
- 排列组合,最终组合为三位数据,建立三级嵌套循环
- 排除结果,限定条件为互不相同且无重复
- 输出最终结果,使用输出函数printf(),进行显示结果整定
源代码
#include<stdio.h>
int main()
{
int i,j,k,a;
int arr[]={1,2,3,4};// 预置元素数值
a=sizeof(arr)/sizeof(int);// 计算元素个数
printf("屏幕输出结果:\n");
for(i=0;i<a;i++) { // 以下为三重循环
for(j=0;j<a;j++) {
for (k=0;k<a;k++) { // 确保i、j、k三位互不相同
if (i!=k&&i!=j&&j!=k) {
printf("%d%d%d\n",arr[i],arr[j],arr[k]);
}
}
}
}
return 0;
}
代码优化
上述代码,时间复杂度为N的三次方,优化思路:排除无效循环
源代码
#include<stdio.h>
int main()
{
int i,j,k,a;
int arr[]={1,2,3,4};// 预置元素数值
a=sizeof(arr)/sizeof(int);// 计算元素个数
printf("屏幕输出结果:\n");
for(i=0;i<a;i++) { // 以下为三重循环
for(j=0;j<a;j++) {
if (i!=j){ //先行判断,减少无效循环
for (k=0;k<a;k++) { // 确保i、j、k三位互不相同
if (i!=k&&j!=k) {
printf("%d%d%d\n",arr[i],arr[j],arr[k]);
}
}
}
}
}
return 0;
}