Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Move from brute-force thinking to an efficient approach using array strategy.
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:
i % 2 == 0, then arr[i] = perm[i / 2].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 <= 1000n is even.Problem summary: 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.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array · Math
2
4
6
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1806: Minimum Number of Operations to Reinitialize a Permutation
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;
}
}
}
}
// Accepted solution for LeetCode #1806: Minimum Number of Operations to Reinitialize a Permutation
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
}
}
}
# Accepted solution for LeetCode #1806: Minimum Number of Operations to Reinitialize a Permutation
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
// Accepted solution for LeetCode #1806: Minimum Number of Operations to Reinitialize a Permutation
struct Solution;
impl Solution {
fn reinitialize_permutation(n: i32) -> i32 {
if n == 2 {
return 1;
}
let mut res = 0;
let mut i = 1;
while res == 0 || i != 1 {
if i % 2 == 0 {
i /= 2;
} else {
i = (n - 1 + i) / 2;
}
res += 1;
}
res
}
}
#[test]
fn test() {
let n = 2;
let res = 1;
assert_eq!(Solution::reinitialize_permutation(n), res);
let n = 4;
let res = 2;
assert_eq!(Solution::reinitialize_permutation(n), res);
let n = 6;
let res = 4;
assert_eq!(Solution::reinitialize_permutation(n), res);
}
// Accepted solution for LeetCode #1806: Minimum Number of Operations to Reinitialize a Permutation
// Auto-generated TypeScript example from java.
function exampleSolution(): void {
}
// Reference (java):
// // Accepted solution for LeetCode #1806: Minimum Number of Operations to Reinitialize a Permutation
// 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;
// }
// }
// }
// }
Use this to step through a reusable interview workflow for this problem.
Two nested loops check every pair or subarray. The outer loop fixes a starting point, the inner loop extends or searches. For n elements this gives up to n²/2 operations. No extra space, but the quadratic time is prohibitive for large inputs.
Most array problems have an O(n²) brute force (nested loops) and an O(n) optimal (single pass with clever state tracking). The key is identifying what information to maintain as you scan: a running max, a prefix sum, a hash map of seen values, or two pointers.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Wrong move: Temporary multiplications exceed integer bounds.
Usually fails on: Large inputs wrap around unexpectedly.
Fix: Use wider types, modular arithmetic, or rearranged operations.