算法-数组元素相乘
题目:给定一数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法:要求O(1)空间复杂度和O(n)的时间复杂度;除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、堆空间和全局静态变量等);实现程序(主流编程语言任选)实现并简单描述。(注意黑体)
中间变量解法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | NSArray *firstArr=[[ NSArray alloc]initWithObjects:@ "3" ,@ "5" ,@ "8" ,@ "10" , nil ]; NSMutableArray *secondArr=[[ NSMutableArray alloc]init]; [secondArr addObject:[ NSNumber numberWithInteger:1]]; for ( NSInteger i=1; i<[firstArr count]; i++) { [secondArr addObject:[ NSNumber numberWithInteger:[secondArr[i-1] integerValue]*[firstArr[i-1] integerValue]]]; } NSInteger temp=1; for ( NSInteger i=[firstArr count]-2; i>=0; i--) { temp *=[firstArr[i+1] integerValue]; secondArr[i]=[ NSNumber numberWithInteger:temp*[secondArr[i] integerValue]]; } for ( NSInteger i=0; i<[secondArr count]; i++) { NSLog (@ "中间变量交换:%@" ,secondArr[i]); } NSLog (@ "iOS技术交流群:228407086" ); NSLog (@ "原文地址:http://www.cnblogs.com/xiaofeixiang" ); |
效果如下:
第一个循环不是特别好想,循环具体过程是这样的:
secondArr[0] ->1
secondArr[1] ->firstArr[0]*secondArr[0] =firstArr[0]
secondArr[2] ->firstArr[1]*secondArr[1] =firstArr[1]*firstArr[0]
secondArr[3] ->firstArr[2]*secondArr[2] =firstArr[2]*firstArr[1]*firstArr[0]
最后我们想要得到的结果,应该是这样的:
secondArr[0] ->firstArr[1]*firstArr[2]*firstArr[3]
secondArr[1] ->firstArr[0]*firstArr[2]*firstArr[3]
secondArr[2] ->firstArr[0]*firstArr[1]*firstArr[3]
secondArr[3] ->firstArr[0]*firstArr[1]*firstArr[2]
因此我们只需要重新遍历依稀,从后向前将对应的索引位置乘以缺失的变量即可,第二个循环就是解决这个问题的,可以得到最后的结果,不过题目中不需要使用中间变量,我们可以使用secondArr[0]作为中间变量,修改如下:
1 2 3 4 5 6 7 8 9 | secondArr[0]=[ NSNumber numberWithInteger:1]; for ( NSInteger i=[firstArr count]-1; i>=1; i--) { secondArr[i]=[ NSNumber numberWithInteger:[secondArr[0] integerValue]*[secondArr[i] integerValue]]; secondArr[0]=[ NSNumber numberWithInteger:[secondArr[0] integerValue]*[firstArr[i] integerValue]]; } for ( NSInteger i=0; i<[secondArr count]; i++) { NSLog (@ "当前的值:%@" ,secondArr[i]); } |
结果也是一样的:
这个题目最主要的是从前向后和从后向前遍历,类似于快速排序的切分的意思~
出处:http://www.cnblogs.com/xiaofeixiang
说明:博客经个人辛苦努力所得,如有转载会特别申明,博客不求技惊四座,但求与有缘人分享个人学习知识,生活学习提高之用,博客所有权归本人和博客园所有,如有转载请在显著位置给出博文链接和作者姓名,否则本人将付诸法律。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述