Problem

You are given a 0-indexed integer array nums. Rearrange the values of nums according to the following rules:

  1. Sort the values at odd indices of nums in non-increasing order.
    • For example, if nums = [4,**_1_** ,2,_**3**_] before this step, it becomes [4,_**3**_ ,2,**_1_**] after. The values at odd indices 1 and 3 are sorted in non-increasing order.
  2. Sort the values at even indices of nums in non-decreasing order.
    • For example, if nums = [_**4**_ ,1,_**2**_ ,3] before this step, it becomes [_**2**_ ,1,_**4**_ ,3] after. The values at even indices 0 and 2 are sorted in non-decreasing order.

Return the array formed after rearranging the values of nums.

Examples

Example 1

1
2
3
4
5
6
7
8
Input: nums = [4,1,2,3]
Output: [2,3,4,1]
Explanation: 
First, we sort the values present at odd indices (1 and 3) in non-increasing order.
So, nums changes from [4,**_1_** ,2,**_3_**] to [4,_**3**_ ,2,**_1_**].
Next, we sort the values present at even indices (0 and 2) in non-decreasing order.
So, nums changes from [_**4**_ ,1,**_2_** ,3] to [_**2**_ ,3,_**4**_ ,1].
Thus, the array formed after rearranging the values is [2,3,4,1].

Example 2

1
2
3
4
5
Input: nums = [2,1]
Output: [2,1]
Explanation: 
Since there is exactly one odd index and one even index, no rearrangement of values takes place.
The resultant array formed is [2,1], which is the same as the initial array. 

Constraints

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 100

Solution

Method 1 - Separate, Sort, and Merge

Intuition: Extract elements at even and odd indices separately, sort them according to their requirements (even indices ascending, odd indices descending), then place them back in their respective positions.

Approach:

  1. Separate elements at even indices and odd indices into different arrays
  2. Sort even-indexed elements in ascending order (non-decreasing)
  3. Sort odd-indexed elements in descending order (non-increasing)
  4. Merge the sorted arrays back into the result, maintaining index parity

Code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
    vector<int> sortEvenOdd(vector<int>& nums) {
        vector<int> evenElements, oddElements;
        
        // Separate elements by index parity
        for (int i = 0; i < nums.size(); i++) {
            if (i % 2 == 0) {
                evenElements.push_back(nums[i]);
            } else {
                oddElements.push_back(nums[i]);
            }
        }
        
        // Sort even indices in ascending order
        sort(evenElements.begin(), evenElements.end());
        
        // Sort odd indices in descending order
        sort(oddElements.begin(), oddElements.end(), greater<int>());
        
        // Merge back into result
        vector<int> result(nums.size());
        int evenIdx = 0, oddIdx = 0;
        
        for (int i = 0; i < nums.size(); i++) {
            if (i % 2 == 0) {
                result[i] = evenElements[evenIdx++];
            } else {
                result[i] = oddElements[oddIdx++];
            }
        }
        
        return result;
    }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import "sort"

func sortEvenOdd(nums []int) []int {
    var evenElements, oddElements []int
    
    // Separate elements by index parity
    for i, num := range nums {
        if i%2 == 0 {
            evenElements = append(evenElements, num)
        } else {
            oddElements = append(oddElements, num)
        }
    }
    
    // Sort even indices in ascending order
    sort.Ints(evenElements)
    
    // Sort odd indices in descending order
    sort.Sort(sort.Reverse(sort.IntSlice(oddElements)))
    
    // Merge back into result
    result := make([]int, len(nums))
    evenIdx, oddIdx := 0, 0
    
    for i := range nums {
        if i%2 == 0 {
            result[i] = evenElements[evenIdx]
            evenIdx++
        } else {
            result[i] = oddElements[oddIdx]
            oddIdx++
        }
    }
    
    return result
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.*;

class Solution {
    public int[] sortEvenOdd(int[] nums) {
        List<Integer> evenElements = new ArrayList<>();
        List<Integer> oddElements = new ArrayList<>();
        
        // Separate elements by index parity
        for (int i = 0; i < nums.length; i++) {
            if (i % 2 == 0) {
                evenElements.add(nums[i]);
            } else {
                oddElements.add(nums[i]);
            }
        }
        
        // Sort even indices in ascending order
        Collections.sort(evenElements);
        
        // Sort odd indices in descending order
        Collections.sort(oddElements, Collections.reverseOrder());
        
        // Merge back into result
        int[] result = new int[nums.length];
        int evenIdx = 0, oddIdx = 0;
        
        for (int i = 0; i < nums.length; i++) {
            if (i % 2 == 0) {
                result[i] = evenElements.get(evenIdx++);
            } else {
                result[i] = oddElements.get(oddIdx++);
            }
        }
        
        return result;
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Solution {
    fun sortEvenOdd(nums: IntArray): IntArray {
        val evenElements = mutableListOf<Int>()
        val oddElements = mutableListOf<Int>()
        
        // Separate elements by index parity
        for (i in nums.indices) {
            if (i % 2 == 0) {
                evenElements.add(nums[i])
            } else {
                oddElements.add(nums[i])
            }
        }
        
        // Sort even indices in ascending order
        evenElements.sort()
        
        // Sort odd indices in descending order
        oddElements.sortDescending()
        
        // Merge back into result
        val result = IntArray(nums.size)
        var evenIdx = 0
        var oddIdx = 0
        
        for (i in nums.indices) {
            if (i % 2 == 0) {
                result[i] = evenElements[evenIdx++]
            } else {
                result[i] = oddElements[oddIdx++]
            }
        }
        
        return result
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
def sortEvenOdd(nums: list[int]) -> list[int]:
    even_elements = []
    odd_elements = []
    
    # Separate elements by index parity
    for i, num in enumerate(nums):
        if i % 2 == 0:
            even_elements.append(num)
        else:
            odd_elements.append(num)
    
    # Sort even indices in ascending order
    even_elements.sort()
    
    # Sort odd indices in descending order
    odd_elements.sort(reverse=True)
    
    # Merge back into result
    result = [0] * len(nums)
    even_idx = odd_idx = 0
    
    for i in range(len(nums)):
        if i % 2 == 0:
            result[i] = even_elements[even_idx]
            even_idx += 1
        else:
            result[i] = odd_elements[odd_idx]
            odd_idx += 1
    
    return result

# Alternative one-liner approach
def sortEvenOdd2(nums: list[int]) -> list[int]:
    even_sorted = sorted([nums[i] for i in range(0, len(nums), 2)])
    odd_sorted = sorted([nums[i] for i in range(1, len(nums), 2)], reverse=True)
    
    result = []
    even_idx = odd_idx = 0
    
    for i in range(len(nums)):
        if i % 2 == 0:
            result.append(even_sorted[even_idx])
            even_idx += 1
        else:
            result.append(odd_sorted[odd_idx])
            odd_idx += 1
    
    return result
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
impl Solution {
    pub fn sort_even_odd(nums: Vec<i32>) -> Vec<i32> {
        let mut even_elements = Vec::new();
        let mut odd_elements = Vec::new();
        
        // Separate elements by index parity
        for (i, &num) in nums.iter().enumerate() {
            if i % 2 == 0 {
                even_elements.push(num);
            } else {
                odd_elements.push(num);
            }
        }
        
        // Sort even indices in ascending order
        even_elements.sort();
        
        // Sort odd indices in descending order
        odd_elements.sort_by(|a, b| b.cmp(a));
        
        // Merge back into result
        let mut result = vec![0; nums.len()];
        let mut even_idx = 0;
        let mut odd_idx = 0;
        
        for i in 0..nums.len() {
            if i % 2 == 0 {
                result[i] = even_elements[even_idx];
                even_idx += 1;
            } else {
                result[i] = odd_elements[odd_idx];
                odd_idx += 1;
            }
        }
        
        result
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function sortEvenOdd(nums: number[]): number[] {
    const evenElements: number[] = [];
    const oddElements: number[] = [];
    
    // Separate elements by index parity
    for (let i = 0; i < nums.length; i++) {
        if (i % 2 === 0) {
            evenElements.push(nums[i]);
        } else {
            oddElements.push(nums[i]);
        }
    }
    
    // Sort even indices in ascending order
    evenElements.sort((a, b) => a - b);
    
    // Sort odd indices in descending order
    oddElements.sort((a, b) => b - a);
    
    // Merge back into result
    const result: number[] = new Array(nums.length);
    let evenIdx = 0, oddIdx = 0;
    
    for (let i = 0; i < nums.length; i++) {
        if (i % 2 === 0) {
            result[i] = evenElements[evenIdx++];
        } else {
            result[i] = oddElements[oddIdx++];
        }
    }
    
    return result;
}

Complexity

  • ⏰ Time complexity: O(n log n) where n is the length of the array (due to sorting operations)
  • 🧺 Space complexity: O(n) for storing the separated even and odd elements