(array)
| 1 | // time O(n) where n is the length of the array |
| 2 | // space O(1) |
| 3 | function subarraySort(array) { |
| 4 | let minOutOfOrder = Infinity; |
| 5 | let maxOutOfOrder = -Infinity; |
| 6 | |
| 7 | for (let i = 0; i < array.length; i++) { |
| 8 | const num = array[i]; |
| 9 | if (isOutOfOrder(i, num, array)) { |
| 10 | minOutOfOrder = Math.min(minOutOfOrder, num); |
| 11 | maxOutOfOrder = Math.max(maxOutOfOrder, num); |
| 12 | } |
| 13 | } |
| 14 | if (minOutOfOrder === Infinity) return [-1, -1]; |
| 15 | |
| 16 | let subarrayLeftIdx = 0; |
| 17 | while (minOutOfOrder >= array[subarrayLeftIdx]) { |
| 18 | subarrayLeftIdx++; |
| 19 | } |
| 20 | let subarrayRightIdx = array.length - 1; |
| 21 | while (maxOutOfOrder <= array[subarrayRightIdx]) { |
| 22 | subarrayRightIdx--; |
| 23 | } |
| 24 | return [subarrayLeftIdx, subarrayRightIdx]; |
| 25 | } |
| 26 | |
| 27 | function isOutOfOrder(i, num, array) { |
| 28 | if (i === 0) return num > array[i + 1]; |
no test coverage detected