Hash table solution to twoSumA 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

'Given that' in a matrix

Is a stroke of luck acceptable after a series of unfavorable events?

Hostile work environment after whistle-blowing on coworker and our boss. What do I do?

Efficient way to transport a Stargate

How does buying out courses with grant money work?

Tiptoe or tiphoof? Adjusting words to better fit fantasy races

How does Loki do this?

How to be diplomatic in refusing to write code that breaches the privacy of our users

Anatomically Correct Strange Women In Ponds Distributing Swords

What can we do to stop prior company from asking us questions?

Avoiding estate tax by giving multiple gifts

How to pronounce the slash sign

What does "I’d sit this one out, Cap," imply or mean in the context?

Was a professor correct to chastise me for writing "Prof. X" rather than "Professor X"?

Lay out the Carpet

What is the difference between "behavior" and "behaviour"?

Increase performance creating Mandelbrot set in python

How do I go from 300 unfinished/half written blog posts, to published posts?

Is the destination of a commercial flight important for the pilot?

Term for the "extreme-extension" version of a straw man fallacy?

Where does the Z80 processor start executing from?

Unreliable Magic - Is it worth it?

Return of the Riley Riddles in Reverse

How did Doctor Strange see the winning outcome in Avengers: Infinity War?



Hash table solution to twoSum


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













8












$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









New contributor




Alice is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$endgroup$







  • 1




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















8












$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









New contributor




Alice is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$endgroup$







  • 1




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













8












8








8


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









New contributor




Alice is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$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









New contributor




Alice is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Alice is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited Mar 22 at 12:25









200_success

130k17155419




130k17155419






New contributor




Alice is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked Mar 22 at 5:27









AliceAlice

1964




1964




New contributor




Alice is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Alice is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Alice is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







  • 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


















7












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












  • $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






  • 1




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


















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$








  • 1




    $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 ()
return StackExchange.using("mathjaxEditing", function ()
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
);
);
, "mathjax-editing");

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
);



);






Alice is a new contributor. Be nice, and check out our Code of Conduct.









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









7












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












  • $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






  • 1




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















7












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












  • $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






  • 1




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













7












7








7





$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

355213




355213










answered Mar 22 at 8:47









LudisposedLudisposed

9,08322267




9,08322267











  • $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






  • 1




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
















  • $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






  • 1




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















$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




1




1




$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













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$








  • 1




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








  • 1




    $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







  • 1




    $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












  • 1




    $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







1




1




$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










Alice is a new contributor. Be nice, and check out our Code of Conduct.









draft saved

draft discarded


















Alice is a new contributor. Be nice, and check out our Code of Conduct.












Alice is a new contributor. Be nice, and check out our Code of Conduct.











Alice is a new contributor. Be nice, and check out our Code of Conduct.














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

Færeyskur hestur Heimild | Tengill | Tilvísanir | LeiðsagnarvalRossið - síða um færeyska hrossið á færeyskuGott ár hjá færeyska hestinum

He _____ here since 1970 . Answer needed [closed]What does “since he was so high” mean?Meaning of “catch birds for”?How do I ensure “since” takes the meaning I want?“Who cares here” meaningWhat does “right round toward” mean?the time tense (had now been detected)What does the phrase “ring around the roses” mean here?Correct usage of “visited upon”Meaning of “foiled rail sabotage bid”It was the third time I had gone to Rome or It is the third time I had been to Rome

Slayer Innehåll Historia | Stil, komposition och lyrik | Bandets betydelse och framgångar | Sidoprojekt och samarbeten | Kontroverser | Medlemmar | Utmärkelser och nomineringar | Turnéer och festivaler | Diskografi | Referenser | Externa länkar | Navigeringsmenywww.slayer.net”Metal Massacre vol. 1””Metal Massacre vol. 3””Metal Massacre Volume III””Show No Mercy””Haunting the Chapel””Live Undead””Hell Awaits””Reign in Blood””Reign in Blood””Gold & Platinum – Reign in Blood””Golden Gods Awards Winners”originalet”Kerrang! Hall Of Fame””Slayer Looks Back On 37-Year Career In New Video Series: Part Two””South of Heaven””Gold & Platinum – South of Heaven””Seasons in the Abyss””Gold & Platinum - Seasons in the Abyss””Divine Intervention””Divine Intervention - Release group by Slayer””Gold & Platinum - Divine Intervention””Live Intrusion””Undisputed Attitude””Abolish Government/Superficial Love””Release “Slatanic Slaughter: A Tribute to Slayer” by Various Artists””Diabolus in Musica””Soundtrack to the Apocalypse””God Hates Us All””Systematic - Relationships””War at the Warfield””Gold & Platinum - War at the Warfield””Soundtrack to the Apocalypse””Gold & Platinum - Still Reigning””Metallica, Slayer, Iron Mauden Among Winners At Metal Hammer Awards””Eternal Pyre””Eternal Pyre - Slayer release group””Eternal Pyre””Metal Storm Awards 2006””Kerrang! Hall Of Fame””Slayer Wins 'Best Metal' Grammy Award””Slayer Guitarist Jeff Hanneman Dies””Bullet-For My Valentine booed at Metal Hammer Golden Gods Awards””Unholy Aliance””The End Of Slayer?””Slayer: We Could Thrash Out Two More Albums If We're Fast Enough...””'The Unholy Alliance: Chapter III' UK Dates Added”originalet”Megadeth And Slayer To Co-Headline 'Canadian Carnage' Trek”originalet”World Painted Blood””Release “World Painted Blood” by Slayer””Metallica Heading To Cinemas””Slayer, Megadeth To Join Forces For 'European Carnage' Tour - Dec. 18, 2010”originalet”Slayer's Hanneman Contracts Acute Infection; Band To Bring In Guest Guitarist””Cannibal Corpse's Pat O'Brien Will Step In As Slayer's Guest Guitarist”originalet”Slayer’s Jeff Hanneman Dead at 49””Dave Lombardo Says He Made Only $67,000 In 2011 While Touring With Slayer””Slayer: We Do Not Agree With Dave Lombardo's Substance Or Timeline Of Events””Slayer Welcomes Drummer Paul Bostaph Back To The Fold””Slayer Hope to Unveil Never-Before-Heard Jeff Hanneman Material on Next Album””Slayer Debut New Song 'Implode' During Surprise Golden Gods Appearance””Release group Repentless by Slayer””Repentless - Slayer - Credits””Slayer””Metal Storm Awards 2015””Slayer - to release comic book "Repentless #1"””Slayer To Release 'Repentless' 6.66" Vinyl Box Set””BREAKING NEWS: Slayer Announce Farewell Tour””Slayer Recruit Lamb of God, Anthrax, Behemoth + Testament for Final Tour””Slayer lägger ner efter 37 år””Slayer Announces Second North American Leg Of 'Final' Tour””Final World Tour””Slayer Announces Final European Tour With Lamb of God, Anthrax And Obituary””Slayer To Tour Europe With Lamb of God, Anthrax And Obituary””Slayer To Play 'Last French Show Ever' At Next Year's Hellfst””Slayer's Final World Tour Will Extend Into 2019””Death Angel's Rob Cavestany On Slayer's 'Farewell' Tour: 'Some Of Us Could See This Coming'””Testament Has No Plans To Retire Anytime Soon, Says Chuck Billy””Anthrax's Scott Ian On Slayer's 'Farewell' Tour Plans: 'I Was Surprised And I Wasn't Surprised'””Slayer””Slayer's Morbid Schlock””Review/Rock; For Slayer, the Mania Is the Message””Slayer - Biography””Slayer - Reign In Blood”originalet”Dave Lombardo””An exclusive oral history of Slayer”originalet”Exclusive! Interview With Slayer Guitarist Jeff Hanneman”originalet”Thinking Out Loud: Slayer's Kerry King on hair metal, Satan and being polite””Slayer Lyrics””Slayer - Biography””Most influential artists for extreme metal music””Slayer - Reign in Blood””Slayer guitarist Jeff Hanneman dies aged 49””Slatanic Slaughter: A Tribute to Slayer””Gateway to Hell: A Tribute to Slayer””Covered In Blood””Slayer: The Origins of Thrash in San Francisco, CA.””Why They Rule - #6 Slayer”originalet”Guitar World's 100 Greatest Heavy Metal Guitarists Of All Time”originalet”The fans have spoken: Slayer comes out on top in readers' polls”originalet”Tribute to Jeff Hanneman (1964-2013)””Lamb Of God Frontman: We Sound Like A Slayer Rip-Off””BEHEMOTH Frontman Pays Tribute To SLAYER's JEFF HANNEMAN””Slayer, Hatebreed Doing Double Duty On This Year's Ozzfest””System of a Down””Lacuna Coil’s Andrea Ferro Talks Influences, Skateboarding, Band Origins + More””Slayer - Reign in Blood””Into The Lungs of Hell””Slayer rules - en utställning om fans””Slayer and Their Fans Slashed Through a No-Holds-Barred Night at Gas Monkey””Home””Slayer””Gold & Platinum - The Big 4 Live from Sofia, Bulgaria””Exclusive! Interview With Slayer Guitarist Kerry King””2008-02-23: Wiltern, Los Angeles, CA, USA””Slayer's Kerry King To Perform With Megadeth Tonight! - Oct. 21, 2010”originalet”Dave Lombardo - Biography”Slayer Case DismissedArkiveradUltimate Classic Rock: Slayer guitarist Jeff Hanneman dead at 49.”Slayer: "We could never do any thing like Some Kind Of Monster..."””Cannibal Corpse'S Pat O'Brien Will Step In As Slayer'S Guest Guitarist | The Official Slayer Site”originalet”Slayer Wins 'Best Metal' Grammy Award””Slayer Guitarist Jeff Hanneman Dies””Kerrang! Awards 2006 Blog: Kerrang! Hall Of Fame””Kerrang! Awards 2013: Kerrang! Legend”originalet”Metallica, Slayer, Iron Maien Among Winners At Metal Hammer Awards””Metal Hammer Golden Gods Awards””Bullet For My Valentine Booed At Metal Hammer Golden Gods Awards””Metal Storm Awards 2006””Metal Storm Awards 2015””Slayer's Concert History””Slayer - Relationships””Slayer - Releases”Slayers officiella webbplatsSlayer på MusicBrainzOfficiell webbplatsSlayerSlayerr1373445760000 0001 1540 47353068615-5086262726cb13906545x(data)6033143kn20030215029