數(shù)據(jù)結(jié)構(gòu):兩數(shù)之和(二)

本文首發(fā)為CSDN博客辞嗡,地址為:http://blog.csdn.net/xxzhangx/article/details/53428582

歡迎關(guān)注稼稿,謝謝硫嘶!引用轉(zhuǎn)載請(qǐng)注明作者和地址淘太!

題目:給定一個(gè)整型的數(shù)組啊终,找出其中的兩個(gè)數(shù)使其和為某個(gè)指定的值疑苔,并返回這兩個(gè)數(shù)的下標(biāo)(數(shù)組下標(biāo)是從0開始)甫匹。假設(shè)數(shù)組元素的值各不相同,則要求時(shí)間復(fù)雜度為O(n)惦费,n為數(shù)組的長(zhǎng)度兵迅。

偽代碼:

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++){
        //掃描一遍,存儲(chǔ)值與下標(biāo)
        hm.put(A[i],i);
    }
    for (int i =0;i<A.length;i++){
        if(hm.containsKey(target-A[i]) && target != 2*A[i]){
            //獲取結(jié)果的兩個(gè)下標(biāo)
            res[0] = i;
            res[1] == hm.get(target - A[i]);
            break;
        }
    }
    return res;
}

偽代碼中使用了hash方法薪贫,由于不熟悉恍箭,故采用類似的方法來做。時(shí)間復(fù)雜度上可能不符合題意瞧省。

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"

不足的是有重復(fù)計(jì)數(shù)扯夭。

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]]]

拓展

如果數(shù)組可能出現(xiàn)相同值的元素,那么上述算法還能正確解決嗎鞍匾?

答案是:可以的

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]]]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末交洗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子橡淑,更是在濱河造成了極大的恐慌构拳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梁棠,死亡現(xiàn)場(chǎng)離奇詭異置森,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)符糊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門暇藏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人濒蒋,你說我怎么就攤上這事盐碱“淹茫” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵瓮顽,是天一觀的道長(zhǎng)县好。 經(jīng)常有香客問我,道長(zhǎng)暖混,這世上最難降的妖魔是什么缕贡? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮拣播,結(jié)果婚禮上晾咪,老公的妹妹穿的比我還像新娘。我一直安慰自己贮配,他們只是感情好谍倦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泪勒,像睡著了一般昼蛀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上圆存,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天叼旋,我揣著相機(jī)與錄音,去河邊找鬼沦辙。 笑死夫植,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的油讯。 我是一名探鬼主播偷崩,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼撞羽!你這毒婦竟也來了阐斜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤诀紊,失蹤者是張志新(化名)和其女友劉穎谒出,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邻奠,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笤喳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碌宴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杀狡。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖贰镣,靈堂內(nèi)的尸體忽然破棺而出呜象,到底是詐尸還是另有隱情膳凝,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布恭陡,位于F島的核電站蹬音,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏休玩。R本人自食惡果不足惜著淆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拴疤。 院中可真熱鬧永部,春花似錦、人聲如沸呐矾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凫佛。三九已至讲坎,卻和暖如春孕惜,著一層夾襖步出監(jiān)牢的瞬間愧薛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工衫画, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毫炉,地道東北人骨望。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓辩块,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親辛掠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弥激,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 數(shù)組在程序設(shè)計(jì)中进陡,為了處理方便, 把具有相同類型的若干變量按有序的形式組織起來微服。這些按序排列的同類數(shù)據(jù)元素的集合稱...
    朱森閱讀 3,926評(píng)論 2 13
  • 來源:NumPy Tutorial - TutorialsPoint 譯者:飛龍 協(xié)議:CC BY-NC-SA 4...
    布客飛龍閱讀 32,793評(píng)論 6 96
  • 兒童急走追黃蝶,飛入菜花無處尋丛肮。天真的孩子與可愛的動(dòng)物們似乎天生就有著某種和諧的關(guān)系,當(dāng)純潔的孩子和可愛的動(dòng)...
    漢谷教育閱讀 241評(píng)論 0 0
  • 書是一匹奔馳的快馬赡磅,翻騰起地下深藏的黑土,掏心撕肺不管不顧地甩了出去宝与,毫不吝惜那肆意的張狂焚廊,端著亦然的自傲冶匹。急馳的...
    z政閱讀 300評(píng)論 4 1
  • 前兩周參加會(huì)議講一篇我發(fā)表的文章徙硅,到交流和提問環(huán)節(jié)時(shí),有個(gè)朋友站起來第一句話是:“我不知道為什么這篇文章能發(fā)”搞疗, ...
    李清昭閱讀 259評(píng)論 0 0