private int findMinBinarySearch(int[] num, int start, int end) {
        if (start == end) return num[start];
        if (end - start == 1) {
            return Math.min(num[start], num[end]);
        } else { // end - start > 1
            int mid = (start + end) / 2;
            if (num[mid] < num[start]) {
                return findMinBinarySearch(num, start, mid);
            } else if (num[mid + 1] > num[end]) {
                return findMinBinarySearch(num, mid + 1, end);
            } else {
                return Math.min(num[start], num[mid + 1]);
            }
        }
    }