Given a **sorted** (in ascending order) integer array nums of n elements and a target value, write a function to search target in nums. If target exists, then return its index, otherwise return -1. ``` Input: nums = [1, 2, 3, 4, 5, 6], target = 3 Output: 2 Input: nums = [2, 4, 5, 6, 11, 17], target = 10 Output: -1 ``` ``` public int binarySearch(int[] nums, int target) { if (nums == null || nums.length == 0) return -1; // 2, 4, 5, 6, 11, 17 // 10 int left = 0; int right = nums.length - 1; // 5 while (left <= right) { int midIdx = (left + right) / 2; int mid = nums[midIdx]; if (target == mid) { return midIdx; } else if (target > mid) { left = midIdx + 1; // 1 } else { right = midIdx - 1; //3 } } return -1; } ``` Map<String, Map<Int, String>> ``` class Data { String val; int time; Data(String val, int time) { this.val = val; this.time = time; } } class TimeMap { Map<String, List<Data>> map; public TimeMap() { map = new HashMap<String, List<Data>>(); } public void set(String key, String value, int timestamp) { if (!map.containsKey(key)) map.put(key, new ArrayList<Data>()); map.get(key).add(new Data(value, timestamp)); } public String get(String key, int timestamp) { if (!map.containsKey(key)) return ""; return binarySearch(map.get(key), timestamp); } protected String binarySearch(List<Data> list, int time) { int low = 0, high = list.size() - 1; while (low < high) { int mid = (low + high) >>> 1; if (list.get(mid).time == time) return list.get(mid).val; if (list.get(mid).time < time) { if (list.get(mid+1).time > time) return list.get(mid).val; low = mid + 1; } else high = mid -1; } return list.get(low).time <= time ? list.get(low).val : ""; } } ``` ``` class CarouselQueue<T> { private val list: MutableList<T> = mutableListOf() private var nextIndex = 0 fun addAll(elements: Collection<T>) { list.addAll(elements) } fun isEmpty() = list.isEmpty() fun next(): T { val next = list[nextIndex] nextIndex ++ nextIndex %= list.size return next } } ```