Skip to main content

Elimination Game

Problem Statement

You have a list arr of all integers in the range [1, n] sorted in a strictly increasing order. Apply the following algorithm on arr:

  • Starting from left to right, remove the first number and every other number afterward until you reach the end of the list.
  • Repeat the previous step again, but this time from right to left, remove the rightmost number and every other number from the remaining numbers.
  • Keep repeating the steps again, alternating left to right and right to left, until a single number remains.

Given the integer n, return the last number that remains in arr.

Leetcode link

Example 1:

Input: n = 9
Output: 6
Explanation:
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
arr = [2, 4, 6, 8]
arr = [2, 6]
arr = [6]

Example 2:

Input: n = 1
Output: 1

Constraints:

  • 1 <= n <= 109

Code

Python Code

class Solution(object):
def lastRemaining(self, n):
"""
:type n: int
:rtype: int
"""
def helper(n, isLeft):
if(n==1): return 1
if(isLeft):
return 2*helper(n//2, 0)
# if started from left side the odd elements will be removed, the only remaining ones will the the even i.e.
# [1 2 3 4 5 6 7 8 9]== [2 4 6 8]== 2*[1 2 3 4]
elif(n%2==1):
return 2*helper(n//2, 1)
# same as left side the odd elements will be removed
else:
return 2*helper(n//2, 1) - 1
# even elements will be removed and the only left ones will be [1 2 3 4 5 6 ]== [1 3 5]== 2*[1 2 3] - 1

return helper(n, 1)