LeetCode 390. Elimination Game(约瑟夫环变种)

Elimination Game

Medium

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 9
2 4 6 8
2 6
6

Output:
6

题意

蛇形(从左往右然后从右往左)删去[1, n]中奇数位置的数,求最后剩下的数

思路

约瑟夫环问题的变种,更加简单。思路也是寻找递推式。
注意到本题每次消去${当前数组长度}/2的数,相邻两次消去方向相反,因此后一次消去的结果是前一次消去的结果的镜像再乘以2. 递推式:

f[n] = 2 * (1 + n/2 - f[n/2])

代码

class Solution {
     
    // f[n] = 2 * (1 + n/2 - f[n/2])
    public int lastRemaining(int n) {
     
        if (n <= 1) {
     
            return n;
        }
        return 2 * (1 + n/2 - lastRemaining(n / 2));
    }
}

你可能感兴趣的:(LeetCode,LeetCode,Medium,Java,约瑟夫环)