📌  相关文章
📜  给定一个排序和旋转数组的 C++ 程序,查找是否存在具有给定总和的对(1)

📅  最后修改于: 2023-12-03 15:11:39.272000             🧑  作者: Mango

给定一个排序和旋转数组的 C++ 程序,查找是否存在具有给定总和的对

本题要求在给定的 排序和旋转 数组中查找是否存在两个数的和等于给定总和,如果存在则返回 true,否则返回 false。

思路

采用双指针的方法进行操作:首先找到旋转数组的最小值及其下标 pivot,然后分别以 pivot,即数组的最小值作为起点,设定两个指针,一个指向 pivot,另一个指向最后一个元素。如果两者之和等于给定的总和,则直接返回 true;若大于总和,则将后指针左移;反之将前指针右移。如果不存在满足条件的数对,则一直遍历到两个指针相遇。

代码片段
bool isPairSum(vector<int>& nums, int sum) {
    // 找到旋转数组的最小值及其下标
    int left = 0, right = nums.size() - 1;
    while (left < right) {
        int mid = (left + right) / 2;
        if (nums[mid] > nums[right]) left = mid + 1;
        else right = mid;
    }
    int pivot = left;

    // 设定两个指针,分别以 pivot 作为起点
    int p1 = pivot, p2 = (p1 + nums.size() - 1) % nums.size();
    while (p1 != p2) {
        int curSum = nums[p1] + nums[p2];
        if (curSum == sum) return true;
        else if (curSum < sum) p1 = (p1 + 1) % nums.size();
        else p2 = (p2 + nums.size() - 1) % nums.size();
    }
    return false;
}
时间复杂度

本算法采用二分查找,时间复杂度为 O(log n),因此总时间复杂度为 O(log n)。

空间复杂度

本算法只用到常数级别的额外空间,因此空间复杂度为 O(1)。

参考链接