Leetcode 3782. Last Remaining Integer After Alternating Deletion Operations

  • [Leetcode 3782. Last Remaining Integer After Alternating Deletion Operations](#Leetcode 3782. Last Remaining Integer After Alternating Deletion Operations)
    • [1. 解题思路](#1. 解题思路)
    • [2. 代码实现](#2. 代码实现)

1. 解题思路

这一题是Leetcode双周赛172的第四题,是一道hard难度的题目。

不过这一题思路上还是十分简单的,就是一个迭代的思路。

对于每一次操作,我们都能直接干掉所有当前数组中偶数位置的数,剩下的数中,我们考察其下一次操作,事实上我们只需要将所有的数字归并之后反序排列,此时我们就划归为了一个 n 2 \frac{n}{2} 2n的问题,其最终的结果就是 n − 2 ∗ f ( n 2 ) n - 2*f(\frac{n}{2}) n−2∗f(2n)。

当然,考虑到 n n n的奇偶性问题,严格的迭代公式为:
f ( n ) = { n + 1 − 2 ⋅ f ( n 2 ) n ≡ 0 ( m o d 2 ) n + 2 − 2 ⋅ f ( ⌈ n 2 ⌉ ) n ≡ 1 ( m o d 2 ) f(n) = \left\{ \begin{aligned} n+1 - 2 \cdot f(\frac{n}{2}) && n \equiv 0 (mod\ 2) \\ n+2 - 2 \cdot f(\lceil\frac{n}{2}\rceil) && n \equiv 1 (mod \ 2) \end{aligned} \right. f(n)=⎩ ⎨ ⎧n+1−2⋅f(2n)n+2−2⋅f(⌈2n⌉)n≡0(mod 2)n≡1(mod 2)

显然,当 n ≤ 2 n\leq 2 n≤2时, f ( n ) = 1 f(n) = 1 f(n)=1。

由此,我们即可迭代求得任意 n n n的答案。

2. 代码实现

给出python代码实现如下:

python 复制代码
class Solution:
    def lastInteger(self, n: int) -> int:
        
        def dp(n):
            if n <= 2:
                return 1
            if n % 2 == 0:
                return n - (2 * dp(n//2) - 1)
            else:
                return n+1 - (2 * dp((n+1)//2) - 1)
        
        return dp(n)

提交代码评测得到:耗时3ms,占用内存17.42MB。

相关推荐
Espresso Macchiato4 小时前
Leetcode 3781. Maximum Score After Binary Swaps
·leetcode medium·leetcode3781·leetcode双周赛172
Espresso Macchiato8 小时前
Leetcode 3768. Minimum Inversion Count in Subarrays of Fixed Length
滑动窗口·leetcode hard·leetcode双周赛171·leetcode 3768
Espresso Macchiato10 小时前
Leetcode 3785. Minimum Swaps to Avoid Forbidden Values
leetcode hard·leetcode周赛481·leetcode 3785
Espresso Macchiato14 小时前
Leetcode 3786. Total Sum of Interaction Cost in Tree Groups
leetcode hard·leetcode 3786·leetcode周赛481
DanyHope10 天前
LeetCode 206. 反转链表:迭代 + 递归双解法全解析
算法·leetcode·链表·递归·迭代
Espresso Macchiato1 个月前
Leetcode 3748. Count Stable Subarrays
算法·leetcode·职场和发展·leetcode hard·leetcode 3748·leetcode周赛476·区间求和
Espresso Macchiato1 个月前
Leetcode 3739. Count Subarrays With Majority Element II
leetcode hard·前序和数组·leetcode双周赛169·leetcode 3739
Q741_1472 个月前
C++ 面试高频考点 链表 迭代 递归 力扣 25. K 个一组翻转链表 每日一题 题解
c++·算法·链表·面试·递归·迭代
Espresso Macchiato2 个月前
Leetcode 3729. Count Distinct Subarrays Divisible by K in Sorted Array
leetcode·leetcode hard·容斥原理·leetcode 3729·leetcode周赛473·前序和数组