演算法 兩數之和

2021-09-12 16:23:47 字數 2157 閱讀 2894

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。

你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。

示例:給定 nums = [2, 7, 11, 15], target = 9

因為 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

我的解答:

class solution ;

}// k 是i 後面的一位

for (int k = i +1; k < j; k++);

}else if (nums[j] + nums[k] == target);}}

// 全都不滿足條件 ij 移動

}return null;

}}

網上最快的解答:

class solution ;

} else

} throw new illegalargumentexception("no two sum solution");

}}

這個演算法我看了大概三天(因為我還要工作,沒有大塊的時間去研究),花了圖,轉換成二進位制,才終於明白作者的大概意思。

當然,同時也看出了這個演算法的漏洞。

比如:

twosum(new int, 4095);
返回的結果是[0,1],第0個元素和第乙個元素,相加顯然不等於4095.

1100 0011 0101 0000 0000  800000  num[i]	

111 1111 1111 2047 length

101 0000 0000 1280 index

1 1000 0110 1010 0000 0000 target 1600000

101 0000 0000 index

1 1000 0110 0101 0000 0000 target -index

111 1111 1111 2047 length

101 0000 0000

補充:2047 二進位制是11111111111 (11個1)

首先取出乙個數,然後讓這個數num[i]&2047 = a

之後取判斷map[a]是不是0(存不存在),如果不是0(存在的話)就直接返回這個數的索引,和存在的map 裡面的索引。

如果不存在,就讓target - num[i] ,然後&2047(11個1)。

在作者的思想裡,11位就可以確定乙個數字,同時也認為,target 減去這個數之後的11 也可以確定是乙個數。其實是錯誤的。23位到11這區間的資料,作者沒有關心。這演算法從這裡看就是有漏洞的。我們就從23位到11位之間做文章,就可以得到這個演算法的漏洞。

比如在做著的演算法裡,0 和2048(100000000000) 是乙個數字 因為,最後11位都是0. 根據這個漏洞去反推作者的演算法。

目標數 1111 1111 1111 (4095)

我找的陣列的第乙個數是 111 1111 1111 (2047)

1111 1111 1111 (4095) - 111 1111 1111 (2047) = 100000000000

然後和11111111111 做& 運算之後的數字是0

這時候如果第二個數字是0,就直接返回了0 和 2048,根本不是target 4095

twosum(new int, 4095);
這個結果應該是0,6, 但是按照網上最快的,返回是0,1。

是因為:

首先,第乙個數2047是

111111111111(11個1) & 2047 等於 2047(11個1)

然後targe(4095 ) - 2047 相當於 111111111111(12個) - 11111111111(11個1) = 100000000000 (應該是2048)

然後把這個數100000000000 (2048) & 2047 = 0

然後把map[0] = 1

到第二個數的時候,0 & 2047 = 0 ,發現這個數存在,就取出來返回。結果兩個數之後是2047 ,根本不是我想要的4095

演算法 兩數之和,三數之和

給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 leetcode 思路 兩層for迴圈時間複雜度是o ...

演算法 兩數之和

問題描述 給定乙個整數陣列nums和乙個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...

演算法 兩數之和

存放輸出下標的陣列 int indexs new int 2 建立雜湊表,key 和value都為integer hashmaphash new hashmap for int i 0 i1.在給定陣列nums中,找兩數之和為target,並返回兩數的在陣列中的下標。2.建立hashmap,利用pu...