"390. Elimination Game題解" 隨便寫幾個小例子查看,發現每次數字個數減少一半,每一層的數之間的間隔相等,然後考慮模擬刪除過程,需要記錄如下幾個變數 1. 每一層的第一個數 2. 當前層的數字個數 3. 當前層每兩個數字的間隔 然後依次模擬刪除,當個數只剩一個的時候返回,然後考慮 ...
[390. Elimination Game題解](https://leetcode.com/contest/2/problems/elimination-game/) 隨便寫幾個小例子查看,發現每次數字個數減少一半,每一層的數之間的間隔相等,然後考慮模擬刪除過程,需要記錄如下幾個變數 1. 每一層的第一個數 2. 當前層的數字個數 3. 當前層每兩個數字的間隔 然後依次模擬刪除,當個數只剩一個的時候返回,然後考慮第一個數和個數,以及間隔怎麼更新。個數就是除二,間隔就是乘二, 然後第一個數,當從左邊刪除的時候,就是上一層的第一個數加上間隔長度,當從右邊刪除的時候,需要考慮個數的奇偶性,偶數的話, 跟上一層一致,奇數的話,就是上一層的加上間隔長度,跟從左邊更新一致。 代碼如下: ```c++ class Solution { public: int lastRemaining(int n) { if(n == 1) return 1; int len = 1; bool f = 1; int left = 1; while(1) { if(f) { left = left + len; } else { if(n & 1) { left = left + len; } } n /= 2; len *= 2; f = !f; if(n == 1) return left; } return 0; } }; ```