題目:
給定一個整數數組,nums和一個目標值target ,請在數組中找出何爲目標值的兩個整數,並返回下標
要求:
不能出國內服利用這個數組中的同一元素,例如:8+8 = 16;
舉例:
給定nums = [2,3,9,12],target = 15;
因爲給定的nums[1] + nums[3] = 3+12 = 15
所以返回[1,3];
思路一:
暴力破解法,兩層循環,第一層從初始位置進行遍歷,第二次遍歷第一層之後數組元素,找到兩數之和爲目標值並輸出位置
/**
暴力破解法
兩層循環,
**/
void function1(NSArray *dataArr,int target)
{
for (int i = 0; i < dataArr.count; i++) {
//第一層循環從初始位置開始
for (int j = i+1;j<dataArr.count ; j++) {
//遍歷i後面值,找到i,j位置和爲目標值,並輸出i,j位置
if ([dataArr[j] intValue] == target - [dataArr[i] intValue]) {
NSLog(@"位置分別爲: %d----%d",i,j);
return;
}
}
}
NSLog(@"此數組無解");
}
思路二:
1.先循環遍歷數組:保存一個字典:
使用字典進行keyValue形式保存數組,key爲值,value爲位置,
2.再次循環數組,直接計算出需要找到的值,然後判斷字典中key是否存在
時間複雜度爲O(n)
/**
思路:
1.先循環遍歷數組:保存一個字典:
使用字典進行keyValue形式保存數組,key爲值,value爲位置,
2.再次循環數組,直接計算出需要找到的值,然後判斷字典中key是否存在
時間複雜度爲O(n)
*/
void function2(NSArray *dataArr,int target)
{
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:dataArr.count];
for (int i = 0; i < dataArr.count; i++) {
//先遍生成字典,key爲值,value爲位置,
[dic setValue:@(i) forKey:dataArr[i]];
}
for (int i = 0; i <dataArr.count; i++) {
//獲取差值
int complement =target - [dataArr[i] intValue] ;
//判斷字典中key值有沒有差值元素,切差值元素不是當前遍歷元素
if ([dic.allKeys containsObject:@(complement)] &&[dic[@(complement)] intValue] != i) {
NSLog(@"位置分別爲: %d----%@",i,dic[@(complement)]);
return;
}
}
NSLog(@"此數組無解");
}
總結:
作爲iOS開發,其中使用的是iOS中語法,請大家見諒,這個算法不是最優解,只是小編的解法,能夠完成這個,大家可以一起討論學習;
希望對大家有用處,歡迎大家點贊+評論,關注我的CSDN,我會定期做一些技術分享!未完待續。。。