📌  相关文章
📜  重复删除第一个元素并将其添加到数组末尾两次恰好 K 次后数组的最后一个元素(1)

📅  最后修改于: 2023-12-03 15:28:31.528000             🧑  作者: Mango

重复删除第一个元素并将其添加到数组末尾两次恰好 K 次后数组的最后一个元素

概述

这个主题询问的是数组的某种操作方式。具体地说,这个操作是重复地将数组的第一个元素删除并将其添加到数组末尾,共进行 K 次。我们的任务是找出 K 次操作后数组的最后一个元素。

解法

要求的最后一个元素其实就是 K 次操作之后数组的“循环点(index of rotation)”。这个点刚好是指数组元素从左到右分为两部分的分界线:即使对整个数组做循环移位(循环地移动元素)也会停在这里。如果我们知道了这个循环点,就可以轻松地回答这个问题了。

方法 1:模拟

模拟一遍删除和添加的过程,直到数组再次变为原来的状态。通常,这个方法就需要在数组上执行 K^2 次操作,其时间复杂度为 O(K^2).

方法 2:找出一般规律

利用数学推导可以解决这个问题。设数组名为 A,长度为 N。对数组进行 k 次操作之后,数组的第一个元素(即 A[0])会变成 A[K%N],即尽可能地平移删除和添加操作后产生的偏移值。

具体来说,A[i] 会变成 A[(i+K) % N] (0 ≤ i < N-k)。于是,我们可以很容易地推出数组的最后一个元素——第 N-K%N 个元素。这个算法的时间复杂度为 O(1)。

def last_element_after_k_rotations(nums: List[int], k: int) -> int:
    n = len(nums)
    return nums[(n - k % n) % n]
总结

题目询问我们通过重复地将数组的第一个元素删除并将其添加到数组末尾,共进行 K 次,找出 K 次操作后数组的最后一个元素(即数组的“循环点”)。我们可以用两种方法解决该问题。第一种方法是模拟K次操作,直到数组再次回到原来的状态,其时间复杂度为 O(K^2)。第二种方法可以称之为“找出一般规律”,通过数学推导直接计算数组的最后一个元素,时间复杂度为 O(1)。