二分和前缀(C++版)

一,二分

二分查找是一种常见的搜索算法,它可以在有序数组中快速定位目标值的位置。二分查找的基本思想是:对于一个有序数组,假设要查找的目标值为 target,每次找到数组的中间位置 mid,然后将 target 与 nums[mid] 进行比较,如果相等则返回 mid,如果 target 小于 nums[mid],则在数组的左半部分继续查找,否则在数组的右半部分继续查找。

二分查找的实现需要注意以下几个问题:

  1. 边界条件:对于数组的左右边界需要进行特判,否则可能会出现数组下标越界的问题。
  2. 循环条件:一般采用左右指针的方式进行查找,循环条件为 left <= right,当 left > right 时查找结束。
  3. 中间位置的计算:一般采用 left + (right - left) / 2 的方式计算中间位置,可以避免溢出问题。
  4. 比较操作:如果 target 与 nums[mid] 相等,则找到目标值,返回 mid;如果 target 小于 nums[mid],则在左半部分查找,即将 right = mid - 1;否则在右半部分查找,即将 left = mid + 1。

以下是一个简单的 C++ 代码实现,用于在有序数组 nums 中查找目标值 target:
 

int binarySearch(vector<int>& nums, int target) {
    int left = 0, right = nums.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            return mid;
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1;
}

 该算法的时间复杂度为 O(log n),其中 n 是数组的长度,空间复杂度为 O(1)。二分查找常用于解决有序数组的查找问题,例如 LeetCode 中的「搜索旋转排序数组」、「搜索二维矩阵」等问题都可以使用二分查找解决。

二,前缀

前缀指的是字符串中以第一个字符开始的连续子串。例如,字符串 "hello" 的前缀为 "h"、"he"、"hel" 和 "hell"。在字符串处理中,经常会用到前缀相关的算法,例如前缀和、前缀最大值等等。

前缀和是指将一个数组中的前缀元素依次相加得到的新数组,通常用于快速计算某个区间内的元素和。以数组 nums 为例,它的前缀和数组 prefix_sum 可以通过如下代码计算:
 

vector<int> prefix_sum(nums.size() + 1, 0);
for (int i = 1; i <= nums.size(); i++) {
    prefix_sum[i] = prefix_sum[i - 1] + nums[i - 1];
}

在计算完前缀和数组之后,可以使用 prefix_sum[j+1] - prefix_sum[i] 快速计算 nums[i...j] 的元素和,其中 i 和 j 是区间的左右边界。

前缀算法是一种非常常见的字符串算法,可以用来快速计算一些和区间相关的统计量,例如元素和、最大值、最小值等等。在实际的编程中,掌握前缀算法对于提高代码效率和优化程序性能非常有帮助。

猜你喜欢

转载自blog.csdn.net/DonFred/article/details/129995097