两数之和II

来源:互联网 发布:连不上树熊网络 编辑:程序博客网 时间:2024/05/18 10:34

问题:给定一个整型数组,找出其中的两个数使其和为某个指定的值,并返回这两个数的下标,假设数组元素各不相同,要求时间复杂度为O(n),n为数组长度。

OC算法实现:

/** 2 */#import <Foundation/Foundation.h>typedef void (^complete)(int indexX, int indexY); //x下标 y下标typedef void (^failed)();@interface HasSumV1 : NSObject- (void)hasSum:(NSArray *)dataArr sum:(int)sum complete:(complete)complete failed:(failed)failed;@end

#import "HasSumV1.h"@implementation HasSumV1- (void)hasSum:(NSArray *)dataArr sum:(int)sum complete:(complete)complete failed:(failed)failed;{    //将数组元素index和value存储于一个Map中 数组index=>Map value,数组value=>Map key    NSMutableDictionary *dataDic = [NSMutableDictionary dictionary];    for (int i = 0;i < dataArr.count; i++) {        NSNumber *value = dataArr[i];        //注意 相同的key会被覆盖 所以此程序有局限性        [dataDic setObject:[NSNumber numberWithInt:i] forKey:value];    }        for (int i = 0; i < dataArr.count; i++) {        //遍历数组 查找Map keys中是否含有目标数据(sum - value[i]) 含有 则获取其其index        BOOL contain = [[dataDic allKeys] containsObject:[NSNumber numberWithInt:sum-[dataArr[i] intValue]]];        BOOL equal = sum == 2*[dataArr[i] intValue];//判定无相同的两数 (此处可不做比较 OC MAP特效注定不会有相同的key)        if (contain && !equal) {            if (complete) {                NSNumber *v = [NSNumber numberWithInt:sum-[dataArr[i] intValue]];                complete(i,[[dataDic objectForKey:v] intValue]);                return;            }        }    }        if (failed) {        failed();    }}@end


0 0
原创粉丝点击