力扣 最大子数组和-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.根据需要捕获的变量类型和修改需求选择合适的捕获方式。
原文地址:https://blog.csdn.net/Sunyanhui1/article/details/144037060
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!