当前位置: 首页 > news >正文

C++系列-STL中搜索相关算法

STL中search相关算法

  • 💢search相关算法
    • 💢💢search算法举例
    • 💢💢search_n算法举例
    • 💢💢binary_search算法举例
  • 💢 lower_bound
  • 💢 upper_bound
  • 💢 lower_bound和upper_bound
  • 💢equal_range


纳兰性德《减字木兰花·相逢不语》
相逢不语,一朵芙蓉著秋雨。小晕红潮,斜溜鬟心只凤翘。
待将低唤,直为凝情恐人见。欲诉幽怀,转过回阑叩玉钗。


💢search相关算法

算法描述
search(beg1, end1, beg2, end2)在[beg1, end1) 范围内查找[beg2, end2)首次出现,查找成功,返回[beg1, end1)内第一次出现[beg2, end2)的位置,查找失败返回end1
search(beg1, end1, beg2, end2, pred)使用pred代替==操作符执行search()
search_n(beg, end, n, val)在[beg, end)范围内查找val出现n次的字序列
search_n(beg, end, n, val, pred)使用pred代替==操作符执行search_n()
binary_search(beg, end, val)使用二分法在[beg, end)范围内查找val,速度非常快。要求序列是有序的,否则结果未知,查找到后返回true,否则false
binary_search(beg, end, val, pred)使用pred代替==操作符执行binary_search()
lower_bound(beg, end, val)在[beg1, end1) 范围内查找第一个不小于val(>=val)的元素的迭代器,查找到后返回该元素的迭代器,否则返回序列的end(),因为内部是二分法实现的,需要保证是有序序列
lower_bound(beg, end, val,pred)查找第一个不满足pred的元素对应的迭代器
upper_bound(beg, end, val)在[beg1, end1) 范围内查找第一个大于val的元素的迭代器,查找到后返回该元素的迭代器,否则返回序列的end(),,因为内部是二分法实现的,需要保证是有序序列

💢💢search算法举例

👉 👉 👉
在下面的代码中,search(vec1.begin(), vec1.end(), vec2.begin(), vec2.end()),当在vec1{1, 33, 44, 2, 5, 55, 25, 44, 2, 7}中找到vec2{44, 2}时返回,在vec1中,有两处44,2子序列,只返回vec1中第一个44对应的迭代器。
search(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), [](int val1, int val2) -> bool {return val2 > val1;},在vec1{1, 33, 23, 2, 5, 55, 25, 44, 2, 7}中,寻找连续的子序列,对应的元素分别小于vec2{44, 5}中的44,5,vec1中的23,2分别小于44,5,故返回vec1中23所对应的迭代器。

code:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;template<typename T>
void print_vector(const vector<T>& vec)
{for (auto i_vec : vec){cout << i_vec << " ";}cout << endl;
}void test01()
{vector<int> vec1 {1, 33, 44, 2, 5, 55, 25, 44, 2, 7};vector<int> vec2 {44, 2};vector<int>::iterator it = search(vec1.begin(), vec1.end(), vec2.begin(), vec2.end());if (it != vec1.end()){vector<int> vec3;vec3.assign(it, vec1.end());print_vector(vec3);}else{cout << "没找到" << endl;}
}void test02()
{vector<int> vec1 {1, 33, 23, 2, 5, 55, 25, 44, 2, 7};vector<int> vec2 {44, 5};// vec2中是一个整体,vec1从头开始搜索,当发现连续的元素满足和vec2的关系时,停止搜索vector<int>::iterator it = search(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), [](int val1, int val2) -> bool {return val2 > val1;});if (it != vec1.end()){vector<int> vec3;vec3.assign(it, vec1.end());print_vector(vec3);}else{cout << "没找到" << endl;}
}
void main()
{test01();test02();system("pause");
}result:
44 2 5 55 25 44 2 7
23 2 5 55 25 44 2 7

💢💢search_n算法举例

👉 👉 👉
在下面的代码中,search_n(vec1.begin(), vec1.end(), 2, 5),在vec1 {1, 33, 44, 2, 5, 5, 25, 44, 2, 7}中搜索连续的2个5,返回第一个5对应的迭代器。
search_n(vec1.begin(), vec1.end(), 3, 5, [](int val1, int val2) -> bool {return val1 > val2;}),在谓词中,第1个参数val1是vec1中的元素,第2个参数val2是5。
在vec1{1, 33, 23, 2, 18, 55, 25, 44, 2, 7}中搜索,连续3个元素满足分别大于5,18, 55, 25满足条件,则返回第一个元素18对应的迭代器。

code:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;template<typename T>
void print_vector(const vector<T>& vec)
{for (auto i_vec : vec){cout << i_vec << " ";}cout << endl;
}void test01()
{vector<int> vec1 {1, 33, 44, 2, 5, 5, 25, 44, 2, 7};vector<int>::iterator it = search_n(vec1.begin(), vec1.end(), 2, 5);if (it != vec1.end()){vector<int> vec3;vec3.assign(it, vec1.end());print_vector(vec3);}else{cout << "没找到" << endl;}
}void test02()
{vector<int> vec1 {1, 33, 23, 2, 18, 55, 25, 44, 2, 7};vector<int>::iterator it = search_n(vec1.begin(), vec1.end(), 3, 5, [](int val1, int val2) -> bool {return val1 > val2;});if (it != vec1.end()){vector<int> vec3;vec3.assign(it, vec1.end());print_vector(vec3);}else{cout << "没找到" << endl;}
}
void main()
{test01();test02();system("pause");
}result:
5 5 25 44 2 7
18 55 25 44 2 7

💢💢binary_search算法举例

👉 👉 👉
binary_search是用二分法进行搜索的,序列应该是经过排序的,否则可能出现错误。
binary_search(vec1.begin(), vec1.end(), 2), 在vec1中搜索2,找到后返回true,否则为false。
binary_search(vec1.begin(), vec1.end(), 55, [](int val1, int val2)-> bool { return val1 > val2; });, 首先在vec1中搜索55,找到后,取vec1.begin()到55对应的迭代器区间中所有元素,与55进行pred中的规则判断,若区间中含有满足对比规则的元素,则返回 true ,反之返回 false。

code:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;template<typename T>
void print_vector(const vector<T>& vec)
{for (auto i_vec : vec){cout << i_vec << " ";}cout << endl;
}void test01()
{vector<int> vec1 {1, 33, 44, 2, 5, 25, 7};cout << "vec1排序前:" << endl;print_vector(vec1);cout << "vec1排序后:" << endl;sort(vec1.begin(), vec1.end());print_vector(vec1);bool result = binary_search(vec1.begin(), vec1.end(), 2);if (result){cout << "找到了" << endl << endl;}else{cout << "没找到" << endl << endl;}
}void test02()
{vector<int> vec1 {1, 33, 23, 18, 55, 25, 44, 23, 7};cout << "vec1排序前:" << endl;print_vector(vec1);cout << "vec1排序后:" << endl;sort(vec1.begin(), vec1.end(),greater<int>());print_vector(vec1);// bool std::binary_search(_FwdIt _First, _FwdIt _Last, const _Ty & _Val, _Pr _Pred);// _Pred 为 bool (*)(const _Ty & _Ele, const _Ty & _Val)// 在bool binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)的基础上,取_First至_Val迭代器区间的所有元素,// 与Val进行自定义规则的对比,若区间中含有满足对比规则的元素,则返回 true ,反之返回 false。bool result = binary_search(vec1.begin(), vec1.end(), 55, [](int val1, int val2)-> bool { return val1 > val2; });if (result){cout << "找到了" << endl;}else{cout << "没找到" << endl;}
}void main()
{test01();test02();system("pause");
}result:
vec1排序前:
1 33 44 2 5 25 7
vec1排序后:
1 2 5 7 25 33 44
找到了vec1排序前:
1 33 23 18 55 25 44 23 7
vec1排序后:
55 44 33 25 23 23 18 7 1
找到了

💢 lower_bound

  • 🔥找到第一个可以插入 __val 的位置,并且不改变原有排序。
  • 🔥找到的是大于等于目标数的位置。

👉 👉 👉
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val);前两个分别为起始和结束迭代器,val是要进行对比的数值。
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& val, Compare comp); comp是自定义的比较规则。
前提是有序的情况下,lower_bound 返回指向第一个值不小于 val 的位置,也就是返回第一个大于等于val值的位置(通过二分查找)。
lower_bound(vec1.begin(), vec1.end(), 3); // – 排序后: 1 2 5 7 25 33 44, 第1个>=3的元素是5,返回其迭代器。
cout << "distance(vec1.begin(), iter1): " << distance(vec1.begin(), iter1) << endl; // distance用于计算两个迭代器之间的距离,从vec1.begin()到5对应的迭代器,距离是2。
lower_bound(vec1.begin(), vec1.end(), 6, [](int val1, int val2)-> bool { return val1 < val2; }),寻找序列中第一个不满足<6的元素。

code:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;template<typename T>
void print_vector(const vector<T>& vec)
{for (auto i_vec : vec){cout << i_vec << " ";}cout << endl;
}void test01()
{vector<int> vec1 {1, 33, 44, 2, 5, 25, 7};cout << "vec1排序前:" << endl;print_vector(vec1);cout << "vec1排序后:" << endl;sort(vec1.begin(), vec1.end());print_vector(vec1);vector<int>::iterator iter1;vector<int>::iterator iter2;// 在动态数组中寻找 >=3 出现的第一个数 并以迭代器的形式返回iter1 = lower_bound(vec1.begin(), vec1.end(), 3);  // -- 排序后: 1 2 5 7 25 33 44, 第1个>=3的元素是5,返回其迭代器// 在动态数组中寻找 >=7 出现的第一个数 并以迭代器的形式返回iter2 = lower_bound(vec1.begin(), vec1.end(), 30);  // -- 排序后: 1 2 5 7 25 33 44, 第1个>=30的元素是33,返回其迭代器// distance用于计算两个迭代器之间的距离,从vec1.begin()到5对应的迭代器,距离是2cout << "distance(vec1.begin(), iter1): " << distance(vec1.begin(), iter1) << endl;// distance用于计算两个迭代器之间的距离,从vec1.begin()到33对应的迭代器,距离是5 cout << "distance(vec1.begin(), iter2): " << distance(vec1.begin(), iter2) << endl; 
}void test02()
{vector<int> vec1 {2, 7, 18, 23, 25, 33, 44, 55};sort(vec1.begin(), vec1.end());cout << "\nvec1:" << endl;print_vector(vec1);vector<int>::iterator iter1;vector<int>::iterator iter2;// vec1的元素是2, 7, 18, 23, 25, 33, 44, 55// iter1, pred的条件是val1<val2, vec1中的元素小于val2,lower_bound返回的是不满足pred设定的条件第1个元素,// 那么应该找到第一个不满足小于6的元素,是7,则返回7对应的迭代器。iter1 = lower_bound(vec1.begin(), vec1.end(), 6, [](int val1, int val2)-> bool { return val1 < val2; });// 应该找到第一个不满足小于30的元素,是7,则返回33对应的迭代器。iter2 = lower_bound(vec1.begin(), vec1.end(), 30, [](int val1, int val2)-> bool { return val1 < val2; });if (iter1 == vec1.end()){cout << "没找到" << endl;}else{cout << *iter1 << endl;}if (iter2 == vec1.end()){cout << "没找到" << endl;}else{cout << *iter2 << endl;}
}
void main()
{test01();test02();system("pause");
}result:
vec1排序前:
1 33 44 2 5 25 7
vec1排序后:
1 2 5 7 25 33 44
distance(vec1.begin(), iter1): 2
distance(vec1.begin(), iter2): 5vec1:
2 7 18 23 25 33 44 55
7
33

💢 upper_bound

  • 🍐找到最后一个可以插入 val 而不改变原来有序数组的排序位置。
  • 🍐前提是有序的情况下,upper_bound 返回第一个大于–val值的位置(通过二分查找)
  • 🍐 用lower_bound类似。只是把lower_bound的 大于等于换成大于, pred是相同的用法。

👉 👉 👉
upper_bound(vec1.begin(), vec1.end(), 4)即找到序列中第一个大于4的位置。
upper_bound(vec1.begin(), vec1.end(), 4, [](int val, int serial)-> bool { return val < serial; }); _Pred(_Val, *_UMid)中的第1个参数是upper_bound中的第3个参数,本例中_Pred要求4<序列中的值,找到第一个满足的位置,应该为8。

code:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;void test01()
{vector<int> vec1 = { 1, 4, 8, 18, 22, 34, 55 };vector<int>::iterator iter1;vector<int>::iterator iter2;// 在vec1中寻找>4的第一个数 返回其迭代器iter1 = upper_bound(vec1.begin(), vec1.end(), 4);  // 大于4,则指向8// 在动态数组中寻找 >7 出现的第一个数 并以迭代器的形式返回iter2 = upper_bound(vec1.begin(), vec1.end(), 15); // 大于17,则指向18if (iter1 == vec1.end())cout << "未找到满足条件的元素" << endl;else{cout << "*iter1: " << * iter1 << endl;  }if (iter2 == vec1.end())cout << "未找到满足条件的元素" << endl;else{cout << "*iter2: " << * iter2 << endl; }
}void test02()
{vector<int> vec1 = { 1, 4, 8, 18, 22, 34, 55 };vector<int>::iterator iter1;vector<int>::iterator iter2;// _Pred(_Val, *_UMid)中的第1个参数是upper_bound中的第3个参数,本例中_Pred要求4<序列中的值,找到第一个满足的位置,应该为8iter1 = upper_bound(vec1.begin(), vec1.end(), 4, [](int val, int serial)-> bool { return val < serial; }); if (iter1 == vec1.end())cout << "未找到满足条件的元素" << endl;else{cout << "*iter1: " << *iter1 << endl; }
}void main()
{test01();test02();system("pause");
}result:
*iter1: 8
*iter2: 18
*iter1: 8

💢 lower_bound和upper_bound

  • 🥝 在没有pred参数的情况下,lower_bound是寻找第一个大于等于参数val的元素的位置,upper_bound是寻找第一个大于参数val的元素的位置。
  • 🥝 有pred的情况下,lower_bound中pred的默认参数为_Pred(*_UMid, _Val),第1个是序列中的元素,第2个是lower_bound中的val参数。upper_bound中pred的默认参数为_Pred(_Val, *_UMid),第2个是upper_bound中的val参数,第2个是序列中的元素。

💢equal_range

  • 🍋 返回pair类型,两个迭代器,第1个是lower_bound,第2个是upper_bound。
code:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;template<typename T>
void print_vector(const vector<T>& vec)
{for (auto i_vec : vec){cout << i_vec << " ";}cout << endl;
}void test01()
{vector<int> vec1 {1, 2, 5, 7, 25, 33, 44};print_vector(vec1);pair<vector<int>::iterator, vector<int>::iterator> p1;// equal_range,返回一对迭代器,第1个是lower_bound(>=33),第2个是upper_bound(>33)p1 = equal_range(vec1.begin(), vec1.end(), 33); if (p1.first != vec1.end()){cout << *p1.first << endl;}else{cout << "lower_bound not found!" << endl;}if (p1.second != vec1.end()){cout << *p1.second << endl;}else{cout << "upper_bound not found!" << endl;}
}void main()
{test01();system("pause");
}result:
1 2 5 7 25 33 44
33
44

相关文章:

C++系列-STL中搜索相关算法

STL中search相关算法 &#x1f4a2;search相关算法&#x1f4a2;&#x1f4a2;search算法举例&#x1f4a2;&#x1f4a2;search_n算法举例&#x1f4a2;&#x1f4a2;binary_search算法举例 &#x1f4a2; lower_bound&#x1f4a2; upper_bound&#x1f4a2; lower_bound和up…...

5.C++程序中的注释

我们来看上节所写的程序 #include <iostream> using namespace std;void prnt() //打印A {cout << "printA" << endl; }int main() {prnt();return 0; } 上面的程序中“//打印A”&#xff0c;表示说明当前函数是打印内容的函数&#xff0c;具体…...

com.kingbase8.util.KSQLException: ERROR: permission denied for table xxx

前言 在信创改造中&#xff0c;数据库替换为国产数据库是不可缺少的一部分。而可替换选项中多数选项无非是人大金仓和达梦数据库二选一。本文将介绍人大金仓在使用过程的问题以及解决办法。 问题 在使用人大金仓数据库后&#xff0c;程序运行报错 com.kingbase8.util.KSQLEx…...

开发小程序

由于之前购入的阿里云ECS放着落灰&#xff0c;碰巧又看到个有趣的项目&#xff0c;于是就做了个生成头像的小程序…由于第一次完整发布小程序&#xff0c;记录一下遇到的问题 小程序名称&#xff1a;靓仔创意头像 &#x1f602; 关于小程序 接口请求&#xff0c;在开发过程中…...

JS考核答案

1.请简述var, let, const的区别&#xff1f; &#xff08;1&#xff09;块级作用域&#xff1a;块作用域由 { }包括&#xff0c;let和const具有块级作用域&#xff0c;var不存在块级作用域。块级作用域解决了ES5中的两个问题&#xff1a; 内层变量可能覆盖外层变量 用来计数的…...

高德地图2.0 绘制、编辑多边形覆盖物(电子围栏)

1. 安装 npm i amap/amap-jsapi-loader --save移步&#xff1a;官方文档 2. map组件封装 <script lang"ts" setup> import AMapLoader from amap/amap-jsapi-loader import { onMounted, ref } from vue import { propTypes } from /utils/propTypesdefineO…...

MySQL底层为什么选择用B+树作为索引

首先&#xff0c;我们来想想为什么这么多数据结构&#xff0c;为什么要用树这种数据结构&#xff1f; 众多的数据结构在逻辑层面可分为&#xff1a;线性结构 和 非线性结构。 线性结构有&#xff1a;数组、链表&#xff0c;基于它们衍生出的有哈希表&#xff08;哈希表也称散…...

MATLAB系列05:自定义函数

MATLAB系列05&#xff1a;自定义函数 5. 自定义函数5.1 MATLAB函数简介5.2 在MATLAB中传递变量&#xff1a;按值传递机制5.3 选择性参数5.4 用全局内存分享数据5.5 在函数两次调用之间本地数据的存储5.6 函数的函数(function functions)5.7 子函数和私有函数5.8 总结 5. 自定义…...

C++速通LeetCode简单第20题-多数元素

方法一&#xff1a;暴力解法&#xff0c;放multiset中排序&#xff0c;然后依次count统计&#xff0c;不满足条件的值erase清除。 class Solution { public:int majorityElement(vector<int>& nums) {int ans 0;multiset<int> s;for(int i 0;i < nums.s…...

回收站永久删除的文件还能恢复吗?教你恢复技巧

在数字时代&#xff0c;电脑是我们工作、学习和娱乐的重要工具。然而&#xff0c;随着我们对电脑的频繁使用&#xff0c;误删文件的情况也时有发生。当我们在回收站中不小心永久删除了某个重要文件时&#xff0c;内心可能会充满焦虑和疑惑&#xff1a;这些文件还能恢复吗&#…...

Python Web 微服务架构全面解析与实战指南

Python Web 微服务架构全面解析与实战指南 目录 &#x1f3d7;️ 微服务基础概念 微服务架构与单体架构的对比微服务的优点与挑战 &#x1f504; 服务间通信 使用REST、gRPC或消息队列实现服务通信API网关的使用&#xff08;如Kong、Traefik&#xff09; &#x1f50d; 服务…...

SEAFARING靶场漏洞攻略

寻找漏洞 一&#xff0c;我们打开页面 第一个漏洞 xss漏洞 1.在登录页面显示有弹窗 第二个漏洞 sql注入漏洞 1.在输入框的地方输入-1 union select 1,2,3#我们来查看他的回显点 2.查看数据库表名 -1 union select 1,database(),3# 3.查看表名 -1 union select 1,2,group…...

ROS 编程入门的介绍

2.1 创建 ROS 功能包 ROS&#xff08;Robot Operating System&#xff09;是一种开源的机器人软件框架&#xff0c;广泛用于机器人开发中。通过使用 ROS&#xff0c;开发者可以轻松创建和管理机器人应用程序。在本节中&#xff0c;我们将介绍如何创建一个 ROS 功能包并实现一些…...

第十一章 抽象类与接口

一、抽象类和抽象方法 抽象类&#xff1a;使用abstract修饰的类 抽象方法&#xff1a;在类中没有方法体的方法&#xff0c;称为抽象方法&#xff0c;抽象方法用abstract修饰 抽象类中可以没有抽象方法&#xff0c;包含抽象方法的类必是抽象类 如果子类没有实现父类中的全部…...

请问企业的八大金刚系统是哪些?有什么共同点和区别?

我的理解的八大金刚包括&#xff1a;MES、ERP、WMS、OMS、CRM、SCM、SRM、PLM。 这些系统的主要功能及运用领域是哪些方面?他们互相之前有什么区别&#xff1f;选择时哪些是企业可能根据自身需求选择的必选项目或可选项目&#xff1f; 由于某些系统的必选性取决于企业的具体业…...

【入门】配置 Java 应用程序的完整指南

前言&#xff1a; Java 是一种广泛使用的编程语言&#xff0c;具备跨平台的特性&#xff0c;使得其应用程序可以在多种环境中高效运行。本文将介绍如何将 Java 应用程序从开发环境部署到生产环境&#xff0c;确保其能够稳定、稳定地运行运行。 确定运行环境 Java程序可以运行…...

flutter widget 设置GestureDetector点击无效

有可能是被上层的widget挡住了&#xff0c;虽然你看得到这个widget&#xff0c;但是操作不到。使用相对布局Stack要特别注意&#xff0c;这种布局会和Android一样&#xff0c;先写的布局放在下层&#xff0c;后写的&#xff0c;如果范围较大的话&#xff0c;会盖在之前的widget…...

基于SpringBoot的在线教育平台的设计与实现

文未可获取一份本项目的java源码和数据库参考。 选题的背景与意义&#xff1a; 随着互联网时代信息技术的不断发展&#xff0c;线下已经产生了很多IT技术的培训机构&#xff0c;但是价格却十分昂贵并且需要人们持续不断的去具体培训地点学习&#xff0c;因此更需要一个课程优…...

Django_Vue3_ElementUI_Release_004_使用nginx部署

1. nginx安装配置 1.1 下载nginx Download nginx 1.2 测试一下 1.3 进入nginx用命令操作 2. 部署 2.1 前端部署 2.1.1 修改nginx监听配置 …conf/nginx.conf http {... # 这里不进行修改server {listen 8010; # 监听 80 端口server_name 192.168.10.24; # 输入服务器 ip…...

Java抽象类的案例

抽象类的特点总结 不能实例化&#xff1a;抽象类不能直接创建实例。它只能被继承。即&#xff0c;你不能用 new 关键字创建抽象类的对象。 可以包含抽象方法&#xff1a;抽象类可以包含一个或多个抽象方法&#xff08;没有方法体&#xff09;&#xff0c;这些方法必须在子类中…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...