给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
一、暴力法:两层循环,挨着遍及查找两数之和并输出下标
时间复杂度:O(n^2)
-(NSArray *)oneSum:(int)target withArr:(NSArray*)nums{
NSNumber* a;
NSNumber* b;
for (int i = 0; i < nums.count-1; i++) {
for (int j=i+1 ; j<nums.count; j++) {
a = nums[i];
b = nums[j];
if([a intValue]+ [b intValue] == target){
return @[[NSNumber numberWithInt:i],[NSNumber numberWithInt:j]];
}
}
}
return @[@"-1",@"-1"];
}
二、利用哈希表
遍历每个元素x,并查找在map中是否有key为x的键值对,如果有则将键值对返回,如果没有,则将target - x最为key,x作为value保存在map中.
简单点理解,就是两个人配对,x先在公告栏map上看有没有找自己的,如果有就建立配对,如果没有就写上目标以及自己的联系方式{target - x:x},当自己的目标查看公告栏时,就可以直接找到自己
时间复杂度:O(n)
-(NSArray *)oneSum1:(int)target withArr:(NSArray*)nums{
NSArray *result;
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:0];
NSNumber * a;
for (int j = 0; j < nums.count; j++) {
a = nums[j];
if (dic[a]) {
// result = @[a,dic[a]]; 此为两个数
result = @[[NSNumber numberWithInteger:[nums indexOfObject:a]],[NSNumber numberWithInteger:[nums indexOfObject:dic[a]]]];
}else{
NSNumber *b = @(target - [a intValue]);
dic[b] = a;
}
}
return result;
}