after reading about Finding three elements in an array whose sum is closest to a given number, this is my attempt at implementing such algorithm
def findThree(seq, goal): # initialize the differences goalDifference = float("inf") dl = -1 dr = -1 dx = -1 for x in range(len(seq)-1): left = x+1 right = len(seq)-1 while (left < right): # if the absolute value of the previous set and the goal is less than the current goalDifference, # keep track of the new set if(abs(goal - (seq[left] + seq[right] + seq[x])) < goalDifference): dl = left dr = right dx = x tmp = seq[left] + seq[right] + seq[x] if tmp > goal: right -= 1 elif tmp < goal: left += 1 else: return [seq[left],seq[right],seq[x]] # if no match is found, return the closest set return [seq[dl],seq[dr], seq[dx]] The algorithm works great for finding exact solutions, given
arr = [89, 120, 140, 179, 199, 259, 259, 259, 320, 320] findThree(arr, 349) // want to get [120, 140, 89] >> [120, 140 89] // success findThree(arr, 439) // want to get [140, 179, 120] >> [140, 179,120] // success however, when I want to see if it'll return the closest, it returns
findThree(arr, 350) // only 1 more than 349, should return [120, 140, 89] >> [320, 320, 259] // fail findThree(arr, 440) // only 1 more than 439, should return [140, 179, 120] >> [320, 320, 259] // fail it appears that when I want it to return the "cloest" element, it always returns [320, 320, 259]. I've been looking at the code for a few hours now, but still can't figure out what's wrong.