Medium

Number of Equal Numbers BlocksC++

Full explanation · Time O(klogn) · Space O(1)

// Time:  O(klogn), k = len(set(nums))
// Space: O(1)

// binary search
class Solution {
public:
    int countBlocks(BigArray* nums) {
        const auto& binary_search_right = [](auto left, auto right, const auto& check) {
            while (left <= right) {
                const auto mid = left + (right - left) / 2;
                if (!check(mid)) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            }
            return right;
        };

        const int64_t n = nums->size();
        int64_t result = 0;
        for (int64_t left = 0; left != n; ++result) {
            const int target = nums->at(left);
            const auto& check = [&](auto x) {
                return nums->at(x) == target;
            };
            left = binary_search_right(left, n - 1, check) + 1;
        }
        return result;
    }
};