An array was sorted in non-decreasing order, and then at most one of its elements was taken out and reinserted at a different position. Given the resulting array, return it sorted in non-decreasing order.
The interviewer asked for an O(n) time solution, so do not sort from scratch.
Function Signature
def fix_almost_sorted(nums: list[int]) -> list[int]:
Rules
-
The input is guaranteed to be either already sorted, or obtainable from a sorted array by moving exactly one element to another position.
-
The moved element may have moved toward the front or toward the back, by any distance.
-
Values may repeat.
-
Return the sorted array. You may rearrange
nums
in place and return it.
-
Target O(n) time and O(1) extra space beyond the returned list.
Constraints
-
1 <= len(nums) <= 10^5
-
-10^9 <= nums[i] <= 10^9
Examples
Example 1
Input: nums = [1, 2, 9, 3, 4, 5]
Output: [1, 2, 3, 4, 5, 9]
The 9 was moved from the end to index 2.
Example 2
Input: nums = [3, 5, 7, 1, 9]
Output: [1, 3, 5, 7, 9]
The 1 was moved from the front to index 3.
Example 3
Input: nums = [1, 1, 2]
Output: [1, 1, 2]
The array is already sorted.