12.14 - 搜索旋转排序数组 && 判断两个结构体是否相等

目录

1.搜索旋转排序数组

a.核心思想

b.思路

2.判断两个结构体是否相等

a.默认情况

b.特殊情况处理

[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.步骤

  1. 初始化指针

    设置左指针 left = 0,右指针 right = nums.size() - 1。

  2. 循环条件

    当 left <= right 时,持续执行以下操作:

  3. 计算中间索引
    mid = left + (right - left) / 2(防止整数溢出)。

  4. 直接命中检查

    若 nums[mid] == target,立即返回 mid。

  5. 判断有序区间

    • 左半有序 :当 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
  6. 未找到处理

    循环结束后仍未找到目标值,返回 -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
}

希望这些内容对大家有所帮助!

感谢大家的三连支持!

相关推荐
fpcc4 小时前
c++编程实践—堆和栈越界调试
c++
yi0115 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
weiabc6 小时前
MSYS2 UCRT64 + g++ C++ 中文输出乱码 完整全过程
c++
灯澜忆梦7 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
禾小西7 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
小蒋观天下7 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J7 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛8 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有8 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu1111118 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode