您的位置:首页 > 教育 > 锐评 > object-C 解答算法:两数之和(leetCode-1)

object-C 解答算法:两数之和(leetCode-1)

2024/10/5 20:13:45 来源:https://blog.csdn.net/wyz670083956/article/details/140451511  浏览:    关键词:object-C 解答算法:两数之和(leetCode-1)

两数之和(leetCode-1)

题目如下图:(也可以到leetCode上看完整题目,题号1)

解答方法一:

最简单的方法就是双指针遍历数组.代码如下

- (NSMutableArray *)sumOfTwoNumbers:(NSMutableArray *)array target:(int)target
{NSMutableArray * resultArray = [[NSMutableArray alloc]init];for (int i = 0; i < array.count; i ++) //这里其实可以写i< array.cout-1;{for (int j = i +1; j < array.count; j ++){if ([array[i] intValue] + [array[j] intValue] == target){resultArray[0] =  [NSString stringWithFormat:@"%d",i];resultArray[1] =  [NSString stringWithFormat:@"%d",j];//题干写了必有且只有一个答案,所以不判断其余情况了return resultArray;;}}}return resultArray;
}

一般双指针循环的时间复杂度比较大,我们来算一个上面代码的时间复杂度为:

n+(n-1)+(n-2)+……1, 是一个等差数列,所以根据等差数列求和公式:Sn =  n/2 x (1+n), 结果为二分之n的平方,

根据大O渐近表示法;二分之一可以忽略,所以这个方法的时间复杂度为 n的平方.

(PS:大多数的双指针循环时间复杂度都为 n的平方)

这个运行时间比较长,所以不太推荐.

解答方法二:

使用一个循环遍历+存储方法

原理:

1.将遍历数组,以数组的元素为key,index为value,将其存入到NSMutableDictionary;

(PS:使用这个存储方法是因为题干说了,数组的元素不会重复出现. 如果数组里的元素重复出现,例如数组里有两个3,则不可以使用这个方法,因为NSMutableDictionary 的key是唯一的)

2.使用目标值-当前遍历的元素值,判断他们的差值在不在NSMutableDictionary里面,如果在,则说明已经存入了,则取出相对性的value即可;如果不在,则继续遍历.

3.继续重复进行步骤2.

代码如下:

- (NSMutableArray *)sumOfTwoNumbers:(NSMutableArray *)array target:(int)target
{NSMutableArray * resultArray = [[NSMutableArray alloc]init];NSMutableDictionary * dic = [[NSMutableDictionary alloc]init];for (int i = 0; i < array.count; i ++){//1.以数组元素值为key,以index(即i)为value[dic setValue: [NSString stringWithFormat:@"%d",i] forKey:array[i]];//2.目标值-当前遍历到的值,就等于另一个值tempNumint tempNum = target - [array[i] intValue];/*只需要判断另一个值tempNum有没有存入dic里,如果有存入,那么可以取出的value,如果还未存入,则取出的value为null*/NSString * tempStr = [dic objectForKey:[NSString stringWithFormat:@"%d",tempNum]];if (tempStr.length != 0){resultArray[0] =  [NSString stringWithFormat:@"%d",i];resultArray[1] =  tempStr;}}return  resultArray;
}

这个解法只进行了一个遍历,所以时间负责度为 O(n)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com