数据结构:两数之和(二)

本文首发为CSDN博客,地址为:http://blog.csdn.net/xxzhangx/article/details/53428582

欢迎关注,谢谢!引用转载请注明作者和地址!

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

伪代码:

int [] twoSum(int [] A,int target){
    int[] res = {-1,-1};
    if (A =null || A.length< 2) return res;
    HashMap < Integer,Integer> hm = new HashMap <Integer,Integer>();
    for(int i =0;i<A.length;i++){
        //扫描一遍,存储值与下标
        hm.put(A[i],i);
    }
    for (int i =0;i<A.length;i++){
        if(hm.containsKey(target-A[i]) && target != 2*A[i]){
            //获取结果的两个下标
            res[0] = i;
            res[1] == hm.get(target - A[i]);
            break;
        }
    }
    return res;
}

伪代码中使用了hash方法,由于不熟悉,故采用类似的方法来做。时间复杂度上可能不符合题意。

R语言:

> res <- list()
> index <- list()
> k =0
> i = 1
> two_sum_2<-function(a,target)
{
  if (is.null(a) || length(a) < 2)
  {
    return("zeros or length is too small")
  }
  if((length(unique(a))) < length(a))
     {
       return("some value repteaed")
  }
  else
  {
    for (i in 1:length(a))
    {
      if(is.element(target-a[i],a))
      {
        k = k + 1
        res[[k]] = c(a[i],target - a[i])
        j = which(a==(target - a[i]))
        index[[k]] = append(res[[k]],c(i,j))
        i = i +1
      }
    }
  }
  return (index)
}

> a= c(1:10,20:30)
> two_sum_2(a,30)
[[1]]
[1]  1 29  1 20

[[2]]
[1]  2 28  2 19

[[3]]
[1]  3 27  3 18

[[4]]
[1]  4 26  4 17

[[5]]
[1]  5 25  5 16

[[6]]
[1]  6 24  6 15

[[7]]
[1]  7 23  7 14

[[8]]
[1]  8 22  8 13

[[9]]
[1]  9 21  9 12

[[10]]
[1] 10 20 10 11

[[11]]
[1] 20 10 11 10

[[12]]
[1] 21  9 12  9

[[13]]
[1] 22  8 13  8

[[14]]
[1] 23  7 14  7

[[15]]
[1] 24  6 15  6

[[16]]
[1] 25  5 16  5

[[17]]
[1] 26  4 17  4

[[18]]
[1] 27  3 18  3

[[19]]
[1] 28  2 19  2

[[20]]
[1] 29  1 20  1

> a=c(1:10,2:10,3:11)
> two_sum_2(a,30)
[1] "some value repteaed"

不足的是有重复计数。

python:

res = []
def two_sum_2(a,target):
    if ((a == None) or (len(a) < 2)):
        return ("zeros or length is too small")
    elif (len(a) > len(set(a))):
        return ("some value repteaed")
    else:
        for i in range(len(a)):
            if (target - a[i]) in a :
                j = a.index(target - a[i])
                res.append([a[i],target-a[i],[i,j]])
    return (res)

b = [1]
print (two_sum_2(b,target=2))

zeros or length is too small

b = [1,2,4,5,1,3,2,1]
print (two_sum_2(b,target=2))

some value repteaed

b = [1,2,3,4,5]
print (two_sum_2(b,target=6))

[[1, 5, [0, 4]], [2, 4, [1, 3]], [3, 3, [2, 2]], [4, 2, [3, 1]], [5, 1, [4, 0]]]

拓展

如果数组可能出现相同值的元素,那么上述算法还能正确解决吗?

答案是:可以的

R语言:

res <- list()
index <- list()
k =0
i = 1
two_sum_2<-function(a,target)
{
  if (is.null(a) || length(a) < 2)
  {
    return("zeros or length is too small")
  }
  else
  {
    for (i in 1:length(a))
    {
      if(is.element(target-a[i],a))
      {
        k = k + 1
        res[[k]] = c(a[i],target - a[i])
        j = which(a==(target - a[i]))
        index[[k]] = append(res[[k]],c(i,j))
        i = i +1
      }
    }
  }
  return (index)
}

> a=c(1:10,2:10,3:11)
> two_sum_2(a,6)
[[1]]
[1]  1  5  1  5 14 22

[[2]]
[1]  2  4  2  4 13 21

[[3]]
[1]  3  3  3  3 12 20

[[4]]
[1]  4  2  4  2 11

[[5]]
[1] 5 1 5 1

[[6]]
[1]  2  4 11  4 13 21

[[7]]
[1]  3  3 12  3 12 20

[[8]]
[1]  4  2 13  2 11

[[9]]
[1]  5  1 14  1

[[10]]
[1]  3  3 20  3 12 20

[[11]]
[1]  4  2 21  2 11

[[12]]
[1]  5  1 22  1

python:

res = []
def two_sum_2(a,target):
    if ((a == None) or (len(a) < 2)):
        return ("zeros or length is too small")
    else:
        for i in range(len(a)):
            if (target - a[i]) in a :
                j = a.index(target - a[i])
                res.append([a[i],target-a[i],[i,j]])
    return (res)

b = [1,2,4,5,1,3,2,1]
print (two_sum_2(b,target=2))

[[1, 1, [0, 0]], [1, 1, [4, 0]], [1, 1, [7, 0]]]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容

  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 3,917评论 2 13
  • 来源:NumPy Tutorial - TutorialsPoint 译者:飞龙 协议:CC BY-NC-SA 4...
    布客飞龙阅读 32,758评论 6 96
  • 儿童急走追黄蝶,飞入菜花无处寻。天真的孩子与可爱的动物们似乎天生就有着某种和谐的关系,当纯洁的孩子和可爱的动...
    汉谷教育阅读 239评论 0 0
  • 书是一匹奔驰的快马,翻腾起地下深藏的黑土,掏心撕肺不管不顾地甩了出去,毫不吝惜那肆意的张狂,端着亦然的自傲。急驰的...
    z政阅读 297评论 4 1
  • 前两周参加会议讲一篇我发表的文章,到交流和提问环节时,有个朋友站起来第一句话是:“我不知道为什么这篇文章能发”, ...
    李清昭阅读 257评论 0 0