In careercup.com, I have seen a problem. It basically asks to get an integer array(includes positives and negatives) and return maximum positive product of three distinct element in it. Sorting is not allowed.
For example:
Expected running time of my solution is O(n). It uses randomized-select. The python code for solution is as follows:
For example:
arr = [9, 10, -12, 4, 7, -8, -13, 4, -8, 12]
elements = (-13, -12, 12)
There are two cases: either P1*P2*P3 or N1*N2*P1(Pi stands for ith biggest and Ni stands for ith smalltest number.). So, the algorithm finds 2 elements in the array by partitioning. One is the 2nd smallest and the other is 3rd biggest number. Then, among biggest 2 element, it finds the maximum. The latest form of array is as follows:
N1,N2,...........,P3,P2,P1
It compares N1*N2 ith. P3*P2. It returns elements of bigger one with P1.
Expected running time of my solution is O(n). It uses randomized-select. The python code for solution is as follows:
from random import random
def randomized_partition(arr, bottom, top):
pv_ind = int(random()* (top-bottom)) +bottom
pivot = arr[pv_ind]
arr[pv_ind] = arr[top-1]
arr[top-1] = pivot
part_ind = bottom
for i in xrange(bottom, top-1):
if arr[i] < pivot:
swap(arr, i, part_ind)
part_ind+=1
swap(arr, part_ind, top-1)
return part_ind
def swap(arr, i, j):
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
def randomized_select(arr, i, bottom, top):
if not (bottom+1) < top:
return
pivot = randomized_partition(arr, bottom, top)
if i > pivot:
randomized_select(arr, i, pivot+1, top)
elif i < pivot:
randomized_select(arr, i, bottom, pivot)
def find_desired_elements(arr, nthsmall, nthbig, bottom, top):
pivot = randomized_partition(arr, bottom, top)
if (pivot>nthsmall-1) & (pivot < nthbig+1):
randomized_select(arr, nthsmall, bottom, pivot)
randomized_select(arr, nthbig, pivot+1, len(arr))
elif pivot>0:
find_desired_elements(arr, nthsmall, nthbig, bottom, pivot)
else:
find_desired_elements(arr, nthsmall, nthbig, pivot+1, len(arr))
def find_max_multiplier(arr):
find_desired_elements(arr, 1, len(arr)-3, 0, len(arr))
if arr[len(arr)-2] > arr[len(arr)-1]:
swap(arr, len(arr)-2, len(arr)-1)
mult1 = arr[0] * arr[1]
mult2 = arr[len(arr)-3] * arr[len(arr)-2]
if mult1 == max(mult1, mult2):
return (arr[0], arr[1], arr[len(arr)-1])
return (arr[len(arr)-3], arr[len(arr)-2] , arr[len(arr)-1])
if __name__ == '__main__':
arr = []
for i in xrange(10):
arr.append(int(random()*-100)+50)
print arr
result = find_max_multiplier(arr)
print arr
print result
P.s: Please leave a comment if you find any error. I have performed several tests on it. All has passed.
Comments
Post a Comment