Leetcode 390. Elimination Game

来源:互联网 发布:杭州淘宝拍摄基地 收费 编辑:程序博客网 时间:2024/06/05 01:18

raw blog:http://blog.csdn.net/corpsepiges/article/details/52573281

 题目:

There is a list of sorted integers from 1 to n. 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 right most number and every other number from the remaining numbers.

We keep repeating the steps again, alternating left to right and right to left, until a single number remains.

Find the last number that remains starting with a list of length n.

Example:

Input:n = 9,1 2 3 4 5 6 7 8 92 4 6 82 66Output:6
思路:

类似剑指offer上那个约瑟夫环问题问题,

Elimination Game思路:逐个删除的思路肯定是超时的。注意到第一次1……n从左到右删除后剩下的是2,4,6,8……这个问题等效于1……n/2(向下取证)从右往左的答案*2。那么再考虑从右往左1……2k+1,和从左往右的效果是等同的,1……2k,则剩下1,3,5,7,9,……等效于2a-1

那么可以递归求解。

class Solution {public:   int lastRemaining(int n) {          return f(n,true);      }       int f(int n,bool flag){          if (n<=2) {              return flag?n:1;          }else{              return 2*f(n/2,!flag)-(((n&1)==0&&!flag)?1:0);          }      }  };