1、暴力肯定会超时,所以得找规律
class Solution {
public:
int lastRemaining(int n, int m)
{
int dp_n1 = 0, dp_n2 = dp_n1;
int n2 = 2;
while(n2 <= n)
{
dp_n2 = (dp_n1 + m)%n2;
dp_n1 = dp_n2;
n2++;
}
return dp_n2;
}
};
t = (m - 1) % n;//if m > n
0 1 2 3 4 5 m = 10
0 1 2 3 4 5 t = (10 - 1)%6 = 3
第一轮删除得为t
delete t -> delete 3
4 5 0 1 2-> t+1 t+2 ...0... t-1 一共n-1 假设结果为x
0 1 ....... n-2 结果是y
0 -> t+1
1 -> t+2
. .
t-1-> n-2
x -> y
(x+t+1)%n = y
(x+(m-1)%n+1)%n = y
(x+m%n-1+1)%n = y -> (x+m)%n = y
dp[n] = (dp[n-1] + m)%n