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.
Given two integers n and k, construct a list answer that contains n different positive integers ranging from 1 to n and obeys the following requirement:
answer = [a1, a2, a3, ... , an], then the list [|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|] has exactly k distinct integers.Return the list answer. If there multiple valid answers, return any of them.
Example 1:
Input: n = 3, k = 1 Output: [1,2,3] Explanation: The [1,2,3] has three different positive integers ranging from 1 to 3, and the [1,1] has exactly 1 distinct integer: 1
Example 2:
Input: n = 3, k = 2 Output: [1,3,2] Explanation: The [1,3,2] has three different positive integers ranging from 1 to 3, and the [2,1] has exactly 2 distinct integers: 1 and 2.
Constraints:
1 <= k < n <= 104Problem summary: Given two integers n and k, construct a list answer that contains n different positive integers ranging from 1 to n and obeys the following requirement: Suppose this list is answer = [a1, a2, a3, ... , an], then the list [|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|] has exactly k distinct integers. Return the list answer. If there multiple valid answers, return any of them.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array · Math
3 1
3 2
beautiful-arrangement)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #667: Beautiful Arrangement II
class Solution {
public int[] constructArray(int n, int k) {
int l = 1, r = n;
int[] ans = new int[n];
for (int i = 0; i < k; ++i) {
ans[i] = i % 2 == 0 ? l++ : r--;
}
for (int i = k; i < n; ++i) {
ans[i] = k % 2 == 0 ? r-- : l++;
}
return ans;
}
}
// Accepted solution for LeetCode #667: Beautiful Arrangement II
func constructArray(n int, k int) []int {
l, r := 1, n
ans := make([]int, n)
for i := 0; i < k; i++ {
if i%2 == 0 {
ans[i] = l
l++
} else {
ans[i] = r
r--
}
}
for i := k; i < n; i++ {
if k%2 == 0 {
ans[i] = r
r--
} else {
ans[i] = l
l++
}
}
return ans
}
# Accepted solution for LeetCode #667: Beautiful Arrangement II
class Solution:
def constructArray(self, n: int, k: int) -> List[int]:
l, r = 1, n
ans = []
for i in range(k):
if i % 2 == 0:
ans.append(l)
l += 1
else:
ans.append(r)
r -= 1
for i in range(k, n):
if k % 2 == 0:
ans.append(r)
r -= 1
else:
ans.append(l)
l += 1
return ans
// Accepted solution for LeetCode #667: Beautiful Arrangement II
struct Solution;
impl Solution {
fn construct_array(n: i32, mut k: i32) -> Vec<i32> {
let mut res = vec![1];
let mut l = 2;
let mut r = n;
let mut forward = true;
for _ in 1..n {
if k > 1 {
if forward {
res.push(r);
r -= 1;
} else {
res.push(l);
l += 1;
}
forward = !forward;
k -= 1;
} else {
if forward {
res.push(l);
l += 1;
} else {
res.push(r);
r -= 1;
}
}
}
res
}
}
#[test]
fn test() {
let n = 3;
let k = 1;
let res = vec![1, 2, 3];
assert_eq!(Solution::construct_array(n, k), res);
let n = 3;
let k = 2;
let res = vec![1, 3, 2];
assert_eq!(Solution::construct_array(n, k), res);
let n = 5;
let k = 2;
let res = vec![1, 5, 4, 3, 2];
assert_eq!(Solution::construct_array(n, k), res);
}
// Accepted solution for LeetCode #667: Beautiful Arrangement II
function constructArray(n: number, k: number): number[] {
let l = 1;
let r = n;
const ans = new Array(n);
for (let i = 0; i < k; ++i) {
ans[i] = i % 2 == 0 ? l++ : r--;
}
for (let i = k; i < n; ++i) {
ans[i] = k % 2 == 0 ? r-- : l++;
}
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.