目录
[c.重载 == 运算符](#c.重载 == 运算符)
1.搜索旋转排序数组
33. 搜索旋转排序数组 - 力扣(LeetCode)
https://leetcode.cn/problems/search-in-rotated-sorted-array/description/
cpp
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (nums[mid] == target)
{
return mid;
}
// 左半部分有序
if (nums[left] <= nums[mid])
{
if (nums[left] <= target && target < nums[mid])
{
right = mid - 1;
} else
{
left = mid + 1;
}
}
// 右半部分有序
else
{
if (nums[mid] < target && target <= nums[right])
{
left = mid + 1;
} else
{
right = mid - 1;
}
}
}
return -1;
}
};
a.核心思想
利用二分查找的思想,在旋转排序数组中高效地查找目标值。通过比较中间元素与两端的元素,确定哪一部分是有序的,再判断目标值是否在有序部分内,逐步缩小查找范围。
b.思路
① 初始化左右指针
left和right分别指向数组的首尾。② 在
left <= right的条件下,计算中间下标mid。③ 如果
nums[mid] == target,直接返回mid。④ 否则,判断
nums[left]到nums[mid]是否有序:
如果
nums[left] <= nums[mid],说明左半部分有序,判断target是否在nums[left]和nums[mid]之间,如果是,则在左半部分继续查找,否则在右半部分查找。如果
nums[left] > nums[mid],说明右半部分有序,判断target是否在nums[mid]和nums[right]之间,如果是,则在右半部分继续查找,否则在左半部分查找。⑤ 重复上述步骤,直到找到目标值或查找范围为空
c.步骤
初始化指针
设置左指针
left = 0,右指针right = nums.size() - 1。循环条件
当
left <= right时,持续执行以下操作:计算中间索引
mid = left + (right - left) / 2(防止整数溢出)。直接命中检查
若
nums[mid] == target,立即返回mid。判断有序区间
- 左半有序 :当
nums[left] <= nums[mid]时
- 若
nums[left] <= target < nums[mid],收缩右边界right = mid - 1- 否则扩展左边界
left = mid + 1- 右半有序 :当
nums[left] > nums[mid]时
- 若
nums[mid] < target <= nums[right],扩展左边界left = mid + 1- 否则收缩右边界
right = mid - 1未找到处理
循环结束后仍未找到目标值,返回
-1。
2.判断两个结构体是否相等
a.默认情况
当结构体所有成员均为基本类型 (如 int、float)或支持比较的自定义类型 时,可直接用 == 比较
cpp
struct Point { int x; int y; };
Point p1{1, 2};
Point p2{1, 2};
bool result = (p1 == p2); // 编译器自动逐成员比较,结果为 true
b.特殊情况处理
若结构体包含不支持比较的成员(如指针、数组),需手动比较
cpp
struct Data {
int id;
const char* name; // 指针类型无法直接比较
};
bool areEqual(const Data& a, const Data& b) {
return (a.id == b.id) &&
(strcmp(a.name, b.name) == 0); // 手动比较指针指向的内容
}
c.重载 == 运算符
可自定义比较逻辑,使代码更简洁
cpp
struct Vector2D {
float x;
float y;
};
// 重载 == 运算符
bool operator==(const Vector2D& a, const Vector2D& b) {
return (a.x == b.x) && (a.y == b.y);
}
int main() {
Vector2D v1{1.0f, 2.0f};
Vector2D v2{1.0f, 2.0f};
return (v1 == v2); // 直接使用 ==,结果为 true
}
希望这些内容对大家有所帮助!
感谢大家的三连支持!