Hash table solution to twoSum Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?A One-Pass Hash Table Solution to twoSumQuick Sum TopCoder (Brute Force solution)FindTwoSums using TupleLeetcode 15. 3 SumFind two values that add up to the sum3-Sum Problem in PythonTwo Sum LeetcodePython 3 two-sum performanceUnique character lookupLeetcode Two Sum code in PythonFaster code for leetcode reverse int

Keep at all times, the minus sign above aligned with minus sign below

Searching extreme points of polyhedron

Why do the Z-fighters hide their power?

Besides transaction validation, are there any other uses of the Script language in Bitcoin

How to achieve cat-like agility?

How do Java 8 default methods hеlp with lambdas?

How does TikZ render an arc?

French equivalents of おしゃれは足元から (Every good outfit starts with the shoes)

IC on Digikey is 5x more expensive than board containing same IC on Alibaba: How?

Random body shuffle every night—can we still function?

Can two people see the same photon?

What does 丫 mean? 丫是什么意思?

How to name indistinguishable henchmen in a screenplay?

How does the body cool itself in a stillsuit?

New Order #6: Easter Egg

What is the proper term for etching or digging of wall to hide conduit of cables

How do you cope with tons of web fonts when copying and pasting from web pages?

Why not use the yoke to control yaw, as well as pitch and roll?

"Destructive power" carried by a B-52?

Should man-made satellites feature an intelligent inverted "cow catcher"?

The test team as an enemy of development? And how can this be avoided?

One-one communication

Pointing to problems without suggesting solutions

Can gravitational waves pass through a black hole?



Hash table solution to twoSum



Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)
Announcing the arrival of Valued Associate #679: Cesar Manara
Unicorn Meta Zoo #1: Why another podcast?A One-Pass Hash Table Solution to twoSumQuick Sum TopCoder (Brute Force solution)FindTwoSums using TupleLeetcode 15. 3 SumFind two values that add up to the sum3-Sum Problem in PythonTwo Sum LeetcodePython 3 two-sum performanceUnique character lookupLeetcode Two Sum code in PythonFaster code for leetcode reverse int



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








9












$begingroup$


I try the most to solve a twoSum problem in leetcode




Given an array of integers, return indices of the two numbers such that they add up to a specific target.



You may assume that each input would have exactly one solution, and you may not use the same element twice.



Example:



Given nums = [2, 7, 11, 15], target = 9,



Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].




The plan:



  1. brute force to iterate len(nums) O(n)

  2. search for target - num[i] with a hash table O(1)

Implement



class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums_d =
for i in range(len(nums)):
nums_d.setdefault(nums[i], []).append(i)

for i in range(len(nums)):
sub_target = target - nums[i]
nums_d[nums[i]].pop(0) #remove the fixer
result = nums_d.get(sub_target)#hash table to search

if result:
return [i, result[0]]
return []


I strives hours for this solution but found that answer accepted but not passed Score 60.




Runtime: 60 ms, faster than 46.66% of Python3 online submissions for Two Sum.
Memory Usage: 16.1 MB, less than 5.08% of Python3 online submissions for Two Sum.




I want to refactor the codes so that to achieve at least faster than 60%.



Could you please provide hints?










share|improve this question











$endgroup$







  • 1




    $begingroup$
    Take care not to misuse the term refactoring when you just mean rewriting.
    $endgroup$
    – 200_success
    Mar 22 at 12:26

















9












$begingroup$


I try the most to solve a twoSum problem in leetcode




Given an array of integers, return indices of the two numbers such that they add up to a specific target.



You may assume that each input would have exactly one solution, and you may not use the same element twice.



Example:



Given nums = [2, 7, 11, 15], target = 9,



Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].




The plan:



  1. brute force to iterate len(nums) O(n)

  2. search for target - num[i] with a hash table O(1)

Implement



class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums_d =
for i in range(len(nums)):
nums_d.setdefault(nums[i], []).append(i)

for i in range(len(nums)):
sub_target = target - nums[i]
nums_d[nums[i]].pop(0) #remove the fixer
result = nums_d.get(sub_target)#hash table to search

if result:
return [i, result[0]]
return []


I strives hours for this solution but found that answer accepted but not passed Score 60.




Runtime: 60 ms, faster than 46.66% of Python3 online submissions for Two Sum.
Memory Usage: 16.1 MB, less than 5.08% of Python3 online submissions for Two Sum.




I want to refactor the codes so that to achieve at least faster than 60%.



Could you please provide hints?










share|improve this question











$endgroup$







  • 1




    $begingroup$
    Take care not to misuse the term refactoring when you just mean rewriting.
    $endgroup$
    – 200_success
    Mar 22 at 12:26













9












9








9


1



$begingroup$


I try the most to solve a twoSum problem in leetcode




Given an array of integers, return indices of the two numbers such that they add up to a specific target.



You may assume that each input would have exactly one solution, and you may not use the same element twice.



Example:



Given nums = [2, 7, 11, 15], target = 9,



Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].




The plan:



  1. brute force to iterate len(nums) O(n)

  2. search for target - num[i] with a hash table O(1)

Implement



class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums_d =
for i in range(len(nums)):
nums_d.setdefault(nums[i], []).append(i)

for i in range(len(nums)):
sub_target = target - nums[i]
nums_d[nums[i]].pop(0) #remove the fixer
result = nums_d.get(sub_target)#hash table to search

if result:
return [i, result[0]]
return []


I strives hours for this solution but found that answer accepted but not passed Score 60.




Runtime: 60 ms, faster than 46.66% of Python3 online submissions for Two Sum.
Memory Usage: 16.1 MB, less than 5.08% of Python3 online submissions for Two Sum.




I want to refactor the codes so that to achieve at least faster than 60%.



Could you please provide hints?










share|improve this question











$endgroup$




I try the most to solve a twoSum problem in leetcode




Given an array of integers, return indices of the two numbers such that they add up to a specific target.



You may assume that each input would have exactly one solution, and you may not use the same element twice.



Example:



Given nums = [2, 7, 11, 15], target = 9,



Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].




The plan:



  1. brute force to iterate len(nums) O(n)

  2. search for target - num[i] with a hash table O(1)

Implement



class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums_d =
for i in range(len(nums)):
nums_d.setdefault(nums[i], []).append(i)

for i in range(len(nums)):
sub_target = target - nums[i]
nums_d[nums[i]].pop(0) #remove the fixer
result = nums_d.get(sub_target)#hash table to search

if result:
return [i, result[0]]
return []


I strives hours for this solution but found that answer accepted but not passed Score 60.




Runtime: 60 ms, faster than 46.66% of Python3 online submissions for Two Sum.
Memory Usage: 16.1 MB, less than 5.08% of Python3 online submissions for Two Sum.




I want to refactor the codes so that to achieve at least faster than 60%.



Could you please provide hints?







python performance algorithm python-3.x k-sum






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Mar 22 at 12:25









200_success

131k17157422




131k17157422










asked Mar 22 at 5:27









AliceAlice

3207




3207







  • 1




    $begingroup$
    Take care not to misuse the term refactoring when you just mean rewriting.
    $endgroup$
    – 200_success
    Mar 22 at 12:26












  • 1




    $begingroup$
    Take care not to misuse the term refactoring when you just mean rewriting.
    $endgroup$
    – 200_success
    Mar 22 at 12:26







1




1




$begingroup$
Take care not to misuse the term refactoring when you just mean rewriting.
$endgroup$
– 200_success
Mar 22 at 12:26




$begingroup$
Take care not to misuse the term refactoring when you just mean rewriting.
$endgroup$
– 200_success
Mar 22 at 12:26










2 Answers
2






active

oldest

votes


















8












$begingroup$

First some stylistic points




  • nums_d.setdefault(nums[i], []).append(i)



    The setdefault is unnecessary here, you can assign a list normally



    nums_d[nums[i]] = [i]



  • When you need both the index and the element use enumerate see PEP279




    nums_d = 
    for i in range(len(nums)):
    nums_d.setdefault(nums[i], []).append(i)



    nums_d = 
    for i, e in enumerate(nums):
    nums_d[e] = [i]



  • Use comprehension when possible (They use the C style looping and is considered to be faster)



    nums_d = e: [i] for i, e in enumerate(nums) 


Hint



You loop over nums twice, but this can be done in one loop! To make it O(n)



Whenever you visit a new element in nums ->



Check if it's sum complement is in nums_d, else add the target - element to the dictionary with the index as value t - e : i





nums_d = 
for i, e in enumerate(nums):
if e in nums_d:
return [nums_d[e], i]
nums_d[target - e] = i






share|improve this answer











$endgroup$








  • 1




    $begingroup$
    Your first bullet point is only true if each number in the array is unique. Otherwise you override instead of append.
    $endgroup$
    – Graipher
    Mar 23 at 11:17






  • 2




    $begingroup$
    @Graipher True, a defaultdict might be more appropriate there.
    $endgroup$
    – Ludisposed
    Mar 23 at 16:28










  • $begingroup$
    $O(2n) = O(n).$
    $endgroup$
    – Solomon Ucko
    Mar 29 at 0:23



















0












$begingroup$


You may assume that each input would have exactly one solution.




So there's no need to iterate over num twice. In fact, you won't even iterate over it for the full range, because you can return when you found the solution.



With the input given, I'd try this:



nums = [2, 7, 11, 15]
target = 9

def twoSum(nums, target):
for i in nums:
for m in nums[nums.index(i)+1:]:
if i + m == target:
return [nums.index(i), nums.index(m)]

print(twoSum(nums, target))


Say i + m is your target twoSum, you iterate over nums for each i and then look in the rest of num if there's any m for which i + m = target, and return when found.



Edit: This fails if you have duplicate integers in nums that add up to target, and it'll be slower if the solution is two elements near the end of nums.



Also: thank you for mentioning Leetcode, it's new to me. Nice!






share|improve this answer











$endgroup$








  • 2




    $begingroup$
    Hey, long time no see! Unfortunately the code you've supplied is worse than the one in the question, as it takes $O(n^2)$ time and either $O(n)$ or $O(n^2)$ memory, depending on the GC. Where in the question it runs in $O(n)$ time and space. Yours is however easier to understand.
    $endgroup$
    – Peilonrayz
    Mar 22 at 22:29











  • $begingroup$
    Hi, yes, I know, Ludisposed pointed that out as well, hence the edit. I came across the question in Triage, and thought I might as well try an answer. Hadn't thought beyond nums given, with which it yields the answer in 1+3+1=5 iterations. I'm not familiar with O(n^2), but I guess that'd be 16 here?
    $endgroup$
    – RolfBly
    Mar 23 at 18:54










  • $begingroup$
    Ah, he must have deleted his comments. :( Yes it goes by the worst case, so if 11 and 15 were the targets. It's different from mathematics however, as your function runs in IIRC worst case $fracn^22$ iterations. And so it's mostly just a vague guess at performance.
    $endgroup$
    – Peilonrayz
    Mar 23 at 22:19











Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "196"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215975%2fhash-table-solution-to-twosum%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes









8












$begingroup$

First some stylistic points




  • nums_d.setdefault(nums[i], []).append(i)



    The setdefault is unnecessary here, you can assign a list normally



    nums_d[nums[i]] = [i]



  • When you need both the index and the element use enumerate see PEP279




    nums_d = 
    for i in range(len(nums)):
    nums_d.setdefault(nums[i], []).append(i)



    nums_d = 
    for i, e in enumerate(nums):
    nums_d[e] = [i]



  • Use comprehension when possible (They use the C style looping and is considered to be faster)



    nums_d = e: [i] for i, e in enumerate(nums) 


Hint



You loop over nums twice, but this can be done in one loop! To make it O(n)



Whenever you visit a new element in nums ->



Check if it's sum complement is in nums_d, else add the target - element to the dictionary with the index as value t - e : i





nums_d = 
for i, e in enumerate(nums):
if e in nums_d:
return [nums_d[e], i]
nums_d[target - e] = i






share|improve this answer











$endgroup$








  • 1




    $begingroup$
    Your first bullet point is only true if each number in the array is unique. Otherwise you override instead of append.
    $endgroup$
    – Graipher
    Mar 23 at 11:17






  • 2




    $begingroup$
    @Graipher True, a defaultdict might be more appropriate there.
    $endgroup$
    – Ludisposed
    Mar 23 at 16:28










  • $begingroup$
    $O(2n) = O(n).$
    $endgroup$
    – Solomon Ucko
    Mar 29 at 0:23
















8












$begingroup$

First some stylistic points




  • nums_d.setdefault(nums[i], []).append(i)



    The setdefault is unnecessary here, you can assign a list normally



    nums_d[nums[i]] = [i]



  • When you need both the index and the element use enumerate see PEP279




    nums_d = 
    for i in range(len(nums)):
    nums_d.setdefault(nums[i], []).append(i)



    nums_d = 
    for i, e in enumerate(nums):
    nums_d[e] = [i]



  • Use comprehension when possible (They use the C style looping and is considered to be faster)



    nums_d = e: [i] for i, e in enumerate(nums) 


Hint



You loop over nums twice, but this can be done in one loop! To make it O(n)



Whenever you visit a new element in nums ->



Check if it's sum complement is in nums_d, else add the target - element to the dictionary with the index as value t - e : i





nums_d = 
for i, e in enumerate(nums):
if e in nums_d:
return [nums_d[e], i]
nums_d[target - e] = i






share|improve this answer











$endgroup$








  • 1




    $begingroup$
    Your first bullet point is only true if each number in the array is unique. Otherwise you override instead of append.
    $endgroup$
    – Graipher
    Mar 23 at 11:17






  • 2




    $begingroup$
    @Graipher True, a defaultdict might be more appropriate there.
    $endgroup$
    – Ludisposed
    Mar 23 at 16:28










  • $begingroup$
    $O(2n) = O(n).$
    $endgroup$
    – Solomon Ucko
    Mar 29 at 0:23














8












8








8





$begingroup$

First some stylistic points




  • nums_d.setdefault(nums[i], []).append(i)



    The setdefault is unnecessary here, you can assign a list normally



    nums_d[nums[i]] = [i]



  • When you need both the index and the element use enumerate see PEP279




    nums_d = 
    for i in range(len(nums)):
    nums_d.setdefault(nums[i], []).append(i)



    nums_d = 
    for i, e in enumerate(nums):
    nums_d[e] = [i]



  • Use comprehension when possible (They use the C style looping and is considered to be faster)



    nums_d = e: [i] for i, e in enumerate(nums) 


Hint



You loop over nums twice, but this can be done in one loop! To make it O(n)



Whenever you visit a new element in nums ->



Check if it's sum complement is in nums_d, else add the target - element to the dictionary with the index as value t - e : i





nums_d = 
for i, e in enumerate(nums):
if e in nums_d:
return [nums_d[e], i]
nums_d[target - e] = i






share|improve this answer











$endgroup$



First some stylistic points




  • nums_d.setdefault(nums[i], []).append(i)



    The setdefault is unnecessary here, you can assign a list normally



    nums_d[nums[i]] = [i]



  • When you need both the index and the element use enumerate see PEP279




    nums_d = 
    for i in range(len(nums)):
    nums_d.setdefault(nums[i], []).append(i)



    nums_d = 
    for i, e in enumerate(nums):
    nums_d[e] = [i]



  • Use comprehension when possible (They use the C style looping and is considered to be faster)



    nums_d = e: [i] for i, e in enumerate(nums) 


Hint



You loop over nums twice, but this can be done in one loop! To make it O(n)



Whenever you visit a new element in nums ->



Check if it's sum complement is in nums_d, else add the target - element to the dictionary with the index as value t - e : i





nums_d = 
for i, e in enumerate(nums):
if e in nums_d:
return [nums_d[e], i]
nums_d[target - e] = i







share|improve this answer














share|improve this answer



share|improve this answer








edited Mar 22 at 11:16









ielyamani

372214




372214










answered Mar 22 at 8:47









LudisposedLudisposed

9,16822369




9,16822369







  • 1




    $begingroup$
    Your first bullet point is only true if each number in the array is unique. Otherwise you override instead of append.
    $endgroup$
    – Graipher
    Mar 23 at 11:17






  • 2




    $begingroup$
    @Graipher True, a defaultdict might be more appropriate there.
    $endgroup$
    – Ludisposed
    Mar 23 at 16:28










  • $begingroup$
    $O(2n) = O(n).$
    $endgroup$
    – Solomon Ucko
    Mar 29 at 0:23













  • 1




    $begingroup$
    Your first bullet point is only true if each number in the array is unique. Otherwise you override instead of append.
    $endgroup$
    – Graipher
    Mar 23 at 11:17






  • 2




    $begingroup$
    @Graipher True, a defaultdict might be more appropriate there.
    $endgroup$
    – Ludisposed
    Mar 23 at 16:28










  • $begingroup$
    $O(2n) = O(n).$
    $endgroup$
    – Solomon Ucko
    Mar 29 at 0:23








1




1




$begingroup$
Your first bullet point is only true if each number in the array is unique. Otherwise you override instead of append.
$endgroup$
– Graipher
Mar 23 at 11:17




$begingroup$
Your first bullet point is only true if each number in the array is unique. Otherwise you override instead of append.
$endgroup$
– Graipher
Mar 23 at 11:17




2




2




$begingroup$
@Graipher True, a defaultdict might be more appropriate there.
$endgroup$
– Ludisposed
Mar 23 at 16:28




$begingroup$
@Graipher True, a defaultdict might be more appropriate there.
$endgroup$
– Ludisposed
Mar 23 at 16:28












$begingroup$
$O(2n) = O(n).$
$endgroup$
– Solomon Ucko
Mar 29 at 0:23





$begingroup$
$O(2n) = O(n).$
$endgroup$
– Solomon Ucko
Mar 29 at 0:23














0












$begingroup$


You may assume that each input would have exactly one solution.




So there's no need to iterate over num twice. In fact, you won't even iterate over it for the full range, because you can return when you found the solution.



With the input given, I'd try this:



nums = [2, 7, 11, 15]
target = 9

def twoSum(nums, target):
for i in nums:
for m in nums[nums.index(i)+1:]:
if i + m == target:
return [nums.index(i), nums.index(m)]

print(twoSum(nums, target))


Say i + m is your target twoSum, you iterate over nums for each i and then look in the rest of num if there's any m for which i + m = target, and return when found.



Edit: This fails if you have duplicate integers in nums that add up to target, and it'll be slower if the solution is two elements near the end of nums.



Also: thank you for mentioning Leetcode, it's new to me. Nice!






share|improve this answer











$endgroup$








  • 2




    $begingroup$
    Hey, long time no see! Unfortunately the code you've supplied is worse than the one in the question, as it takes $O(n^2)$ time and either $O(n)$ or $O(n^2)$ memory, depending on the GC. Where in the question it runs in $O(n)$ time and space. Yours is however easier to understand.
    $endgroup$
    – Peilonrayz
    Mar 22 at 22:29











  • $begingroup$
    Hi, yes, I know, Ludisposed pointed that out as well, hence the edit. I came across the question in Triage, and thought I might as well try an answer. Hadn't thought beyond nums given, with which it yields the answer in 1+3+1=5 iterations. I'm not familiar with O(n^2), but I guess that'd be 16 here?
    $endgroup$
    – RolfBly
    Mar 23 at 18:54










  • $begingroup$
    Ah, he must have deleted his comments. :( Yes it goes by the worst case, so if 11 and 15 were the targets. It's different from mathematics however, as your function runs in IIRC worst case $fracn^22$ iterations. And so it's mostly just a vague guess at performance.
    $endgroup$
    – Peilonrayz
    Mar 23 at 22:19















0












$begingroup$


You may assume that each input would have exactly one solution.




So there's no need to iterate over num twice. In fact, you won't even iterate over it for the full range, because you can return when you found the solution.



With the input given, I'd try this:



nums = [2, 7, 11, 15]
target = 9

def twoSum(nums, target):
for i in nums:
for m in nums[nums.index(i)+1:]:
if i + m == target:
return [nums.index(i), nums.index(m)]

print(twoSum(nums, target))


Say i + m is your target twoSum, you iterate over nums for each i and then look in the rest of num if there's any m for which i + m = target, and return when found.



Edit: This fails if you have duplicate integers in nums that add up to target, and it'll be slower if the solution is two elements near the end of nums.



Also: thank you for mentioning Leetcode, it's new to me. Nice!






share|improve this answer











$endgroup$








  • 2




    $begingroup$
    Hey, long time no see! Unfortunately the code you've supplied is worse than the one in the question, as it takes $O(n^2)$ time and either $O(n)$ or $O(n^2)$ memory, depending on the GC. Where in the question it runs in $O(n)$ time and space. Yours is however easier to understand.
    $endgroup$
    – Peilonrayz
    Mar 22 at 22:29











  • $begingroup$
    Hi, yes, I know, Ludisposed pointed that out as well, hence the edit. I came across the question in Triage, and thought I might as well try an answer. Hadn't thought beyond nums given, with which it yields the answer in 1+3+1=5 iterations. I'm not familiar with O(n^2), but I guess that'd be 16 here?
    $endgroup$
    – RolfBly
    Mar 23 at 18:54










  • $begingroup$
    Ah, he must have deleted his comments. :( Yes it goes by the worst case, so if 11 and 15 were the targets. It's different from mathematics however, as your function runs in IIRC worst case $fracn^22$ iterations. And so it's mostly just a vague guess at performance.
    $endgroup$
    – Peilonrayz
    Mar 23 at 22:19













0












0








0





$begingroup$


You may assume that each input would have exactly one solution.




So there's no need to iterate over num twice. In fact, you won't even iterate over it for the full range, because you can return when you found the solution.



With the input given, I'd try this:



nums = [2, 7, 11, 15]
target = 9

def twoSum(nums, target):
for i in nums:
for m in nums[nums.index(i)+1:]:
if i + m == target:
return [nums.index(i), nums.index(m)]

print(twoSum(nums, target))


Say i + m is your target twoSum, you iterate over nums for each i and then look in the rest of num if there's any m for which i + m = target, and return when found.



Edit: This fails if you have duplicate integers in nums that add up to target, and it'll be slower if the solution is two elements near the end of nums.



Also: thank you for mentioning Leetcode, it's new to me. Nice!






share|improve this answer











$endgroup$




You may assume that each input would have exactly one solution.




So there's no need to iterate over num twice. In fact, you won't even iterate over it for the full range, because you can return when you found the solution.



With the input given, I'd try this:



nums = [2, 7, 11, 15]
target = 9

def twoSum(nums, target):
for i in nums:
for m in nums[nums.index(i)+1:]:
if i + m == target:
return [nums.index(i), nums.index(m)]

print(twoSum(nums, target))


Say i + m is your target twoSum, you iterate over nums for each i and then look in the rest of num if there's any m for which i + m = target, and return when found.



Edit: This fails if you have duplicate integers in nums that add up to target, and it'll be slower if the solution is two elements near the end of nums.



Also: thank you for mentioning Leetcode, it's new to me. Nice!







share|improve this answer














share|improve this answer



share|improve this answer








edited Mar 22 at 10:43

























answered Mar 22 at 8:02









RolfBlyRolfBly

592418




592418







  • 2




    $begingroup$
    Hey, long time no see! Unfortunately the code you've supplied is worse than the one in the question, as it takes $O(n^2)$ time and either $O(n)$ or $O(n^2)$ memory, depending on the GC. Where in the question it runs in $O(n)$ time and space. Yours is however easier to understand.
    $endgroup$
    – Peilonrayz
    Mar 22 at 22:29











  • $begingroup$
    Hi, yes, I know, Ludisposed pointed that out as well, hence the edit. I came across the question in Triage, and thought I might as well try an answer. Hadn't thought beyond nums given, with which it yields the answer in 1+3+1=5 iterations. I'm not familiar with O(n^2), but I guess that'd be 16 here?
    $endgroup$
    – RolfBly
    Mar 23 at 18:54










  • $begingroup$
    Ah, he must have deleted his comments. :( Yes it goes by the worst case, so if 11 and 15 were the targets. It's different from mathematics however, as your function runs in IIRC worst case $fracn^22$ iterations. And so it's mostly just a vague guess at performance.
    $endgroup$
    – Peilonrayz
    Mar 23 at 22:19












  • 2




    $begingroup$
    Hey, long time no see! Unfortunately the code you've supplied is worse than the one in the question, as it takes $O(n^2)$ time and either $O(n)$ or $O(n^2)$ memory, depending on the GC. Where in the question it runs in $O(n)$ time and space. Yours is however easier to understand.
    $endgroup$
    – Peilonrayz
    Mar 22 at 22:29











  • $begingroup$
    Hi, yes, I know, Ludisposed pointed that out as well, hence the edit. I came across the question in Triage, and thought I might as well try an answer. Hadn't thought beyond nums given, with which it yields the answer in 1+3+1=5 iterations. I'm not familiar with O(n^2), but I guess that'd be 16 here?
    $endgroup$
    – RolfBly
    Mar 23 at 18:54










  • $begingroup$
    Ah, he must have deleted his comments. :( Yes it goes by the worst case, so if 11 and 15 were the targets. It's different from mathematics however, as your function runs in IIRC worst case $fracn^22$ iterations. And so it's mostly just a vague guess at performance.
    $endgroup$
    – Peilonrayz
    Mar 23 at 22:19







2




2




$begingroup$
Hey, long time no see! Unfortunately the code you've supplied is worse than the one in the question, as it takes $O(n^2)$ time and either $O(n)$ or $O(n^2)$ memory, depending on the GC. Where in the question it runs in $O(n)$ time and space. Yours is however easier to understand.
$endgroup$
– Peilonrayz
Mar 22 at 22:29





$begingroup$
Hey, long time no see! Unfortunately the code you've supplied is worse than the one in the question, as it takes $O(n^2)$ time and either $O(n)$ or $O(n^2)$ memory, depending on the GC. Where in the question it runs in $O(n)$ time and space. Yours is however easier to understand.
$endgroup$
– Peilonrayz
Mar 22 at 22:29













$begingroup$
Hi, yes, I know, Ludisposed pointed that out as well, hence the edit. I came across the question in Triage, and thought I might as well try an answer. Hadn't thought beyond nums given, with which it yields the answer in 1+3+1=5 iterations. I'm not familiar with O(n^2), but I guess that'd be 16 here?
$endgroup$
– RolfBly
Mar 23 at 18:54




$begingroup$
Hi, yes, I know, Ludisposed pointed that out as well, hence the edit. I came across the question in Triage, and thought I might as well try an answer. Hadn't thought beyond nums given, with which it yields the answer in 1+3+1=5 iterations. I'm not familiar with O(n^2), but I guess that'd be 16 here?
$endgroup$
– RolfBly
Mar 23 at 18:54












$begingroup$
Ah, he must have deleted his comments. :( Yes it goes by the worst case, so if 11 and 15 were the targets. It's different from mathematics however, as your function runs in IIRC worst case $fracn^22$ iterations. And so it's mostly just a vague guess at performance.
$endgroup$
– Peilonrayz
Mar 23 at 22:19




$begingroup$
Ah, he must have deleted his comments. :( Yes it goes by the worst case, so if 11 and 15 were the targets. It's different from mathematics however, as your function runs in IIRC worst case $fracn^22$ iterations. And so it's mostly just a vague guess at performance.
$endgroup$
– Peilonrayz
Mar 23 at 22:19

















draft saved

draft discarded
















































Thanks for contributing an answer to Code Review Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

Use MathJax to format equations. MathJax reference.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215975%2fhash-table-solution-to-twosum%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Kamusi Yaliyomo Aina za kamusi | Muundo wa kamusi | Faida za kamusi | Dhima ya picha katika kamusi | Marejeo | Tazama pia | Viungo vya nje | UrambazajiKuhusu kamusiGo-SwahiliWiki-KamusiKamusi ya Kiswahili na Kiingerezakuihariri na kuongeza habari

Swift 4 - func physicsWorld not invoked on collision? The Next CEO of Stack OverflowHow to call Objective-C code from Swift#ifdef replacement in the Swift language@selector() in Swift?#pragma mark in Swift?Swift for loop: for index, element in array?dispatch_after - GCD in Swift?Swift Beta performance: sorting arraysSplit a String into an array in Swift?The use of Swift 3 @objc inference in Swift 4 mode is deprecated?How to optimize UITableViewCell, because my UITableView lags

Access current req object everywhere in Node.js ExpressWhy are global variables considered bad practice? (node.js)Using req & res across functionsHow do I get the path to the current script with Node.js?What is Node.js' Connect, Express and “middleware”?Node.js w/ express error handling in callbackHow to access the GET parameters after “?” in Express?Modify Node.js req object parametersAccess “app” variable inside of ExpressJS/ConnectJS middleware?Node.js Express app - request objectAngular Http Module considered middleware?Session variables in ExpressJSAdd properties to the req object in expressjs with Typescript