一応準備しておこうかと思って試作。あまりちゃんと分かってないので詳細理解は追って・・・
解いていた問題
解法メモ
- 二分探索する
実装メモ
- 一旦↓の感じになった
/** * ref: https://webbibouroku.com/Blog/Article/cs-lowerbound-upperbound */ fun lowerBound(list: List<Int>, value: Int): Int { var left = 0 var right = list.lastIndex while (left <= right) { val mid = (left + right) / 2 if (list[mid] < value) { left = mid + 1 } else { right = mid - 1 } } return left } /** * ref: https://webbibouroku.com/Blog/Article/cs-lowerbound-upperbound */ fun upperBound(list: List<Int>, value: Int): Int { var left = 0 var right = list.lastIndex while (left <= right) { val mid = (left + right) / 2 if (list[mid] <= value) { left = mid + 1 } else { right = mid - 1 } } return left }
- ざっとですが、参考にさせていただいた記事でテストしていたin/outが想定通り出るところまではテスト済み
@Test fun lowerBoundTest() { val list = mutableListOf(1, 2, 2, 2, 4, 4, 4, 5, 6) val expected = mutableListOf(0, 0, 1, 4, 4, 7, 8, 9) for (i in 0..7) { assertEquals(expected[i], _library().lowerBound(list, i)) } } @Test fun upperBoundTest() { val list = mutableListOf(1, 2, 2, 2, 4, 4, 4, 5, 6) val expected = mutableListOf(0, 1, 4, 4, 7, 8, 9, 9) for (i in 0..7) { assertEquals(expected[i], _library().upperBound(list, i)) } }
提出した回答
- Submission #40146580 - 競技プログラミングの鉄則 演習問題集
- 一応この問題は通ってるんだけども、binarySearch(=同値があるときに返る値が保証されない)でもACが出ていたので、これだけで実戦投入可能かどうかは判断しきれないかも
*1:参考:https://note.com/kirimin_chan/n/n3b5c9a0d4290
*2:参考:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/binary-search.html
*3:参考:https://cpprefjp.github.io/reference/algorithm/lower_bound.html
*4:参考:https://cpprefjp.github.io/reference/algorithm/upper_bound.html
*5:参考:https://webbibouroku.com/Blog/Article/cs-lowerbound-upperbound