返回介绍

solution / 1800-1899 / 1806.Minimum Number of Operations to Reinitialize a Permutation / README_EN

发布于 2024-06-17 01:03:14 字数 4646 浏览 0 评论 0 收藏 0

1806. Minimum Number of Operations to Reinitialize a Permutation

中文文档

Description

You are given an even integer n​​​​​​. You initially have a permutation perm of size n​​ where perm[i] == i(0-indexed)​​​​.

In one operation, you will create a new array arr, and for each i:

  • If i % 2 == 0, then arr[i] = perm[i / 2].
  • If i % 2 == 1, then arr[i] = perm[n / 2 + (i - 1) / 2].

You will then assign arr​​​​ to perm.

Return _the minimum non-zero number of operations you need to perform on _perm_ to return the permutation to its initial value._

 

Example 1:

Input: n = 2
Output: 1
Explanation: perm = [0,1] initially.
After the 1st operation, perm = [0,1]
So it takes only 1 operation.

Example 2:

Input: n = 4
Output: 2
Explanation: perm = [0,1,2,3] initially.
After the 1st operation, perm = [0,2,1,3]
After the 2nd operation, perm = [0,1,2,3]
So it takes only 2 operations.

Example 3:

Input: n = 6
Output: 4

 

Constraints:

  • 2 <= n <= 1000
  • n​​​​​​ is even.

Solutions

Solution 1: Find Pattern + Simulation

We observe the change pattern of the numbers and find that:

  1. The even-indexed numbers of the new array are the numbers in the first half of the original array in order;
  2. The odd-indexed numbers of the new array are the numbers in the second half of the original array in order.

That is, if the index $i$ of a number in the original array is in the range [0, n >> 1), then the new index of this number is i << 1; otherwise, the new index is (i - (n >> 1)) << 1 | 1.

In addition, the path of number movement is the same in each round of operation. As long as a number (except for numbers $0$ and $n-1$) returns to its original position, the entire sequence will be consistent with the previous one.

Therefore, we choose the number $1$, whose initial index is also $1$. Each time we move the number $1$ to a new position, until the number $1$ returns to its original position, we can get the minimum number of operations.

The time complexity is $O(n)$, and the space complexity is $O(1)$.

class Solution:
  def reinitializePermutation(self, n: int) -> int:
    ans, i = 0, 1
    while 1:
      ans += 1
      if i < n >> 1:
        i <<= 1
      else:
        i = (i - (n >> 1)) << 1 | 1
      if i == 1:
        return ans
class Solution {
  public int reinitializePermutation(int n) {
    int ans = 0;
    for (int i = 1;;) {
      ++ans;
      if (i < (n >> 1)) {
        i <<= 1;
      } else {
        i = (i - (n >> 1)) << 1 | 1;
      }
      if (i == 1) {
        return ans;
      }
    }
  }
}
class Solution {
public:
  int reinitializePermutation(int n) {
    int ans = 0;
    for (int i = 1;;) {
      ++ans;
      if (i < (n >> 1)) {
        i <<= 1;
      } else {
        i = (i - (n >> 1)) << 1 | 1;
      }
      if (i == 1) {
        return ans;
      }
    }
  }
};
func reinitializePermutation(n int) (ans int) {
  for i := 1; ; {
    ans++
    if i < (n >> 1) {
      i <<= 1
    } else {
      i = (i-(n>>1))<<1 | 1
    }
    if i == 1 {
      return ans
    }
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文