📅  最后修改于: 2023-12-03 15:11:39.272000             🧑  作者: Mango
本题要求在给定的 排序和旋转 数组中查找是否存在两个数的和等于给定总和,如果存在则返回 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)。