二分查找&删除数组target元素

二分查找

链接: 704.二分查找

思考过程:

复制代码
// 思路是二分法
// 看着有点熟悉,却一时想不起怎么解
// 有点忘记二分的使用条件:有序加不重复
// 循环方式实现查找
// 递归方式怎么解?

解题代码

c++ 复制代码
int LCFuntion::search(vector<int> &data, int target)
{
    int left = 0, right = data.size() - 1;
    while (left <= right) {
        int mid = (right - left) / 2 + left;
        if (data[mid] == target) {
            return mid;
        }
        else if (data[mid] > target) {
            right = mid - 1;
        }
        else if (data[mid] < target) {
            left = mid + 1;
        }
    }
    return -1;
}

要点总结:注意区分区间的左右开闭处理

移除数组内target元素

链接: 27. 移除元素

// 移除数组内target元素,且保持剩下元素连续

// 想法是遍历+移动元素

// 数组的下标写错了data.size(),导致数组越绝访问崩溃

// 函数崩溃,猜测是数组越界问题,但是没发现问题在哪?

// 在不同编译器下,for (auto i = data.size() - 1; i >= 0; i--)

// 中的i 被推导为不同类型,mingw下是未定义类型,msvc下是unsigned __int64

// 它们都会导致越界问题,因为是无符号类型,永远不可能小于0,所以不能滥用auto

// 时间复杂度O(n^2)

解题代码如下:

c++ 复制代码
int LCFuntion::removeElement(vector<int> &data, int target)
{
    int moveSize = data.size();
    for (int i = data.size() - 1; i >= 0; i--) {
        //        for (auto i = data.size() - 1; i >= 0; i--) {
        qDebug() << "index" << i << typeid(i).name();
        if (data[i] == target) {
            // 后面元素前移
            int j = i;
            while (j < moveSize - 1) {
                data[j] = data[j + 1];
                j++;
            }
            moveSize--;
        }
    }
    return moveSize;
}

我的解法是暴力遍历移动元素,时间复杂度较高

经过优化,可以做到O(n)的时间复杂度

优化后的代码:

C++ 复制代码
// 双指针的优化版本
// 使用交换的技术来实现
// 当双指针相遇,就代表已经移动到后面了
// 但是改变了数组元素相对位置
// 里循环的 left <= right 条件判断要在前面 不然可能会越界
// 边界条件处理不到位 是否要 <=
int LCFuntion::removeElement2(vector<int> &nums, int val)
{
    int right = nums.size() - 1;
    int left  = 0;
    while (left <= right) {
        // find val
        while (left <= right && nums[left] != val) left++;
        // find not val
        while (left <= right && nums[right] == val) right--;
        // swap
        if (left < right) {
            std::swap(nums[left++], nums[right--]);
        }
    }
    return left;
}
相关推荐
咕白m62512 分钟前
Java 实现 Excel 转 HTML:完整示例
java
RealPluto1 小时前
Spring AOP 失效排查
java·spring
码路飞1 小时前
热榜全是 OpenClaw,但我用 50 行 Python 就造了个桌面 AI Agent 🤖
java·javascript
Nyarlathotep01131 小时前
LinkedList源码分析
java·后端
CoovallyAIHub1 小时前
181小时视频丢给GPT-5,准确率只有15%——南大联合NVIDIA等五校发布多模态终身理解数据集
深度学习·算法·计算机视觉
用户8307196840822 小时前
Java 告别繁琐数据统计代码!MySQL 8 窗口函数真香
java·sql·mysql
CoovallyAIHub2 小时前
CVPR 2026 | GS-CLIP:3D几何先验+双流视觉融合,零样本工业缺陷检测新SOTA,四大3D工业数据集全面领先!
深度学习·算法·计算机视觉
带刺的坐椅2 小时前
SolonCode v0.0.20 发布 - 编程智能体(新增子代理和浏览器能力)
java·ai·agent·solon·solon-ai·claude-code·openclaw
会员源码网3 小时前
数字格式化陷阱:如何优雅处理 NumberFormatException
java
孔明click334 小时前
Sa-Token v1.45.0 发布 🚀,正式支持 Spring Boot 4、新增 Jackson3/Snack4 插件适配
java·sa-token·开源·springboot·登录·权限认证