Bootstrap

力扣 最大子数组和-53

最大子数组和-53

归并排序(快速排序)(分治算法)

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        MergSort(nums,0,nums.size()-1);
        return nums;
    }
    //递归前进分解数组 回退合并数组
    void MergSort(vector<int>& nums,int L,int R)
    {
        if(L>=R)return;//终止条件
        int mid = (L+R)/2;//将数组分为两部分mid为中点
        MergSort(nums,L,mid);//递归处理左半部分
        MergSort(nums,mid+1,R);//递归处理右半部分
        Merg(nums,L,R,mid);//合并两部分
    }
    //用于排序合并
    void Merg(vector<int>& nums, int L, int R,int mid)
    {
        vector<int> temp(R-L+1);//申请临时数组temp,申请数组大小为:R-L+1
        int index = 0;//index是当前临时数组的起始写入位置
        int i=L,j=mid+1;//i为左半数组的起始位置,j为右半数组的起始位置
        while(i<=mid&&j<=R)//两个子数组都不能超过各自子数组的大小
        {
            if(nums[i]<nums[j])
                temp[index++] = nums[i++];// 左子数组的当前元素较小,写入temp,移动指针j
            else
                temp[index++] = nums[j++];// 右子数组的当前元素较小,写入temp,移动指针j
        }//每次写入数组后index都向后移动
        while(i<=mid)temp[index++] = nums[i++];//如果左子数组有剩余写到数组temp尾部
        while(j<=R)temp[index++] = nums[j++];//如果右子数组有剩余写到数组temp尾部
        index = L;//还原 排序的时候是L到R 还原时候也必须是L到R
        for(int f =0;f<R-L+1;f++)
        {//将排序合并后的数组temp中的元素拷贝回vec的对应区间L~R
            nums[index++]=temp[f];
        }
    }
};

每日问题

什么是 C++ 中的 Lambda 表达式?它的作用是什么?

C++ 中的 Lambda 表达式

定义

Lambda 表达式是一种匿名函数,允许在函数内定义内联函数对象。这种语法引入于 C++11,适用于需要快速定义简单函数逻辑的场景。

语法
[捕获列表](参数列表) -> 返回类型 {
    函数体
};

捕获列表:定义 Lambda 如何捕获外部作用域的变量。

参数列表:Lambda 的参数列表,与普通函数类似。

返回类型(可选):指定返回值类型,如果省略,编译器会自动推导。

函数体:Lambda 的具体操作。

Lambda 表达式的作用

内联函数:

        在函数或代码块内部快速定义无需命名的函数。

        避免定义单独的函数或类,使代码更紧凑、清晰。

提高代码灵活性:

        作为回调函数、事件处理器、或者传递给算法的自定义逻辑。

闭包特性:

        可以捕获周围作用域中的变量,具备灵活的数据共享能力。

Lambda 表达式的使用示例

1. 基本示例
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    auto add = [](int a, int b) -> int {
        return a + b;
    };
    std::cout << add(3, 4) << std::endl;  // 输出 7
    return 0;
}
2. 与标准库算法结合
 
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};
    std::for_each(nums.begin(), nums.end(), [](int x) {
        std::cout << x * x << " ";
    });  // 输出 1 4 9 16 25
    return 0;
}

Lambda 表达式可以捕获哪些类型的变量?有哪些捕获方式?

1. 捕获列表的作用

捕获列表定义了 Lambda 如何访问外部作用域中的变量。Lambda 是函数对象,因此捕获的变量会被作为其内部成员。

2. 捕获方式

捕获列表支持以下几种捕获方式:

捕获示例

1. 值捕获([=])
#include <iostream>

int main() {
    int x = 10, y = 20;
    auto add = [=](int z) {
        return x + y + z;  // x 和 y 是值捕获的
    };
    std::cout << add(5) << std::endl;  // 输出 35
    return 0;
}

捕获的变量 x 和 y 的值是捕获时的值,后续即使变量发生改变,Lambda 内部的值不受影响。

2. 引用捕获([&])
#include <iostream>

int main() {
    int x = 10, y = 20;
    auto modify = [&]() {
        x += 5;  // 通过引用修改 x 的值
        y += 10; // 通过引用修改 y 的值
    };
    modify();
    std::cout << x << " " << y << std::endl;  // 输出 15 30
    return 0;
}
3. 混合捕获
#include <iostream>

int main() {
    int x = 10, y = 20;
    auto mix = [=, &y]() {
        // x 是值捕获,y 是引用捕获
        // 不能修改 x,但可以修改 y
        y += 5;
        return x + y;
    };
    std::cout << mix() << std::endl;  // 输出 35
    std::cout << y << std::endl;      // 输出 25
    return 0;
}
4. 捕获 this 指针
#include <iostream>

class Example {
public:
    int value = 42;
    void show() {
        auto print = [this]() {
            std::cout << value << std::endl;
        };
        print();  // 输出 42
    }
};

int main() {
    Example e;
    e.show();
    return 0;
}

捕获 this 允许访问当前对象的成员变量和成员函数。

总结

作用

        1.定义匿名函数,提高代码灵活性和简洁性。

        2.用作回调函数、事件处理器或自定义算法逻辑。

捕获方式

        1.捕获列表支持多种捕获方式(值捕获、引用捕获、捕获 this 等)。

        2.根据需要捕获的变量类型和修改需求选择合适的捕获方式。

;