diff --git a/kt/find-if-array-can-be-sorted.kt b/kt/find-if-array-can-be-sorted.kt new file mode 100644 index 0000000..47c451b --- /dev/null +++ b/kt/find-if-array-can-be-sorted.kt @@ -0,0 +1,46 @@ +class Solution { + private fun min( + x: Int, + y: Int, + ): Int = listOf(x, y).min() + + private fun max( + x: Int, + y: Int, + ): Int = listOf(x, y).max() + + private data class State( + val prevMax: Int, + val bitCount: Int, + val min: Int, + val max: Int, + ) { + val sortable: Boolean + get() = min >= prevMax + + private fun getSegmentMaximum( + prevMax: Int, + min: Int, + max: Int, + ): Int = + if (min < prevMax) { + Int.MAX_VALUE + } else { + max + } + + fun update(num: Int): State = + if (bitCount == num.countOneBits()) { + State(prevMax, bitCount, min(min, num), max(max, num)) + } else { + State(getSegmentMaximum(prevMax, min, max), num.countOneBits(), num, num) + } + } + + private fun getInitialState(num: Int): State = State(Int.MIN_VALUE, num.countOneBits(), num, num) + + fun canSortArray(nums: IntArray): Boolean = + nums.fold(getInitialState(nums[0])) { acc, it -> + acc.update(it) + }.sortable +}