diff --git a/kotlin/153-Find-Minimum-In-Rotated-Sorted-Array.kt b/kotlin/153-Find-Minimum-In-Rotated-Sorted-Array.kt new file mode 100644 index 000000000..6049f7a6b --- /dev/null +++ b/kotlin/153-Find-Minimum-In-Rotated-Sorted-Array.kt @@ -0,0 +1,19 @@ +class Solution { + fun findMin(nums: IntArray): Int { + val n = nums.size + if(n == 1) return nums[0] + var low = 0 + var high = n - 1 + var min = Int.MIN_VALUE + while(low < high) { + var mid = low + (high - low)/2 + if(nums[mid] < nums[high]) { + high = mid + } else { + low = mid + 1 + } + min = nums[low] + } + return min + } +} \ No newline at end of file diff --git a/kotlin/239-Sliding-Window-Maximum.kt b/kotlin/239-Sliding-Window-Maximum.kt new file mode 100644 index 000000000..cf0d5feca --- /dev/null +++ b/kotlin/239-Sliding-Window-Maximum.kt @@ -0,0 +1,38 @@ +class Solution { + fun maxSlidingWindow(nums: IntArray, k: Int): IntArray { + if (nums.isEmpty() || k == 0) { + return intArrayOf() + } + var i = 0 + val queue = arrayListOf() + val array = IntArray(nums.size - k + 1) + var slideIndex = 0 + + while (i < nums.size) { + /** + * remove head if it is out of range of the sliding window + */ + if (queue.isNotEmpty() && i - queue[0] == k) { + queue.removeAt(0) + } + + /** + * remove from the tail if it's smaller than nums[i] + */ + var j = queue.size - 1 + while (queue.isNotEmpty() && j >= 0 && nums[queue[j]] < nums[i]) { + queue.removeAt(queue.size - 1) + j -- + } + + queue.add(i) + if (i - k + 1 >= 0) { + array[slideIndex ++] = nums[queue[0]] + } + + i++ + } + + return array + } +} \ No newline at end of file diff --git a/kotlin/4-Median-Of-Two-Sorted-Arrays.kt b/kotlin/4-Median-Of-Two-Sorted-Arrays.kt new file mode 100644 index 000000000..2cd9644a1 --- /dev/null +++ b/kotlin/4-Median-Of-Two-Sorted-Arrays.kt @@ -0,0 +1,14 @@ +class Solution { + fun findMedianSortedArrays(nums1: IntArray, nums2: IntArray): Double { + var i1 = 0 + var i2 = 0 + fun getNext() = when { + i1 < nums1.size && i2 < nums2.size -> if (nums1[i1] < nums2[i2]) nums1[i1++] else nums2[i2++] + i1 < nums1.size -> nums1[i1++] + else -> nums2[i2++] + } + val arr = IntArray(nums1.size + nums2.size) { getNext() } + return if (arr.size % 2 == 1) arr[arr.size / 2].toDouble() + else (arr[arr.size / 2] + arr[arr.size / 2 - 1]) / 2.0 + } +} \ No newline at end of file