給定乙個整數陣列 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...