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

【算法学习计划】贪心算法(上)

目录

前言(什么是贪心)

leetcode 860.柠檬水找零

leetcode 2208.将数组和减半的最少操作次数

leetcode 179.最大数

leetcode 376.摆动序列

leetcode 300.最长递增子序列

leetcode 334.递增的三元子序列

leetcode 674.最长连续递增序列

leetcode 121.买卖股票的最佳时机

leetcode 122.买卖股票的最佳时机Ⅱ

leetcode 1005.K次取反后最大化的数组和


前言(什么是贪心)

这篇博客算是一个新的开端,因为一共有29道贪心将会在这个系列中被讲解

由于29道题目对于单篇博客太多了,所以我会将其分为上中下三个章节对其进行讲解,每一篇都有接近10篇贪心

而在开始之前,我们需要先讲解一下,贪心是什么,以及怎么样才算是贪

我们贪心其实就是只关注一个局部,从这个局部之中推导出应该怎么贪,并“希望”能够得到正确的解法

对的,就是希望,因为贪心不一定是正确的

我们就先用一道找零问题来举例子,

{40, 20, 10, 5, 1},现在我们有一个数组,代表我们可以找给顾客的钱(买完饮料之后的找钱),假设客人给了48块钱,要我们用最少的钱的张数给客人找钱,那我们贪心的算法就应该是能用大额纸币就用大的,所以我们要贪心的话,就应该先用40块,然后发现还剩下8块,就是5+1+1+1这样子找钱

但如果现在数组是{40, 20, 16, 10, 5, 1},我们在数组中加了一个16,那么贪心的话其实还是40+5+1+1+1,这是贪心,但是我们会发现16+16+16只用三张即可,所以证明我们贪错了

这就是我为什么说是“希望”能找到正确的答案

可能看到这里你会觉得,贪心有点像赌狗算法,但其实不然,因为正确的贪心是可以通过证明得出,这样子的贪心是绝对没有问题的,注意,是证明,严格的数学证明

比如我们为什么第一种情况可以,那是因为40后面是20,40代表两张20,我如果不用40,我就需要20+20,但这样子还不如一张40,后面的情况也是如此,所以我们这种贪心才是对的

但是第二种为什么是错的,因为并不对等,我这里的16是40无法取代的,所以才出现了问题

综上,贪心是一种关注局部的方法,可以通过证明来保证这样子贪是对的

还有一点需要大家注意的是,贪心想不出来是正常的!!!

就像田忌赛马,这也是贪心的一种,但所有人都能想出来吗?并不是

所以放平心态,学贪心就是学学别人是怎么贪的,积攒经验,下次再见到的时候就会了

(下文中的标题都是leedcode对应题目的链接)

leetcode 860.柠檬水找零

这道题目的解释在前言中被用做例子,这里就不再解释了

主要逻辑就是,优先选最大的数额找钱,还有就是,如果我们一刚开始是没有钱的,所以如果第一个元素不是 5 的话那就直接返回 false,接着如果我们在后面的找钱工作中有10块或者5块不够的情况的话,我们就返回false

另外,我们在收到 20 元的时候需要先判断一下,我们是否有一张 5 块和一张 10 块,有的话就用,没有的话就判断一下是否有 3 张 5 块,还没有就返回false,有的话就继续

代码如下:

class Solution {
public:bool lemonadeChange(vector<int>& bills) {if(bills[0] != 5) return false;int five = 0, ten = 0, twen = 0;    for(auto e : bills){if(e == 5) five++;else if( e == 10){if(!five) return false;five--, ten++;}else{if(ten && five) ten--, five--, twen++;else if(five < 3)return false;else five -= 3, twen++;}}return true;}
};

leetcode 2208.将数组和减半的最少操作次数

这道题目我们的贪法就是,一直找最大的那个数,然后对其进行减半操作,每进行一次减半操作,我们就将记录减半次数的计数器++,当我们减少的数减少到数组总和的一半的时候,我们就跳出循环,然后返回计数器即可

首先,为什么我们这一道题目可以这么贪,假设我们第一个数不将最大的数减半的话,那么我们将其他任何一个数减半都没有这个数减的多(这就是体现了贪心的点,同时也是证明),所以我们这种做法一定是对的

我们每一次都减少当时最大数的一半,如果有其他做法的话,那么减半的必然不是最大的那个数,那么也必然没有这个数减的多

综上,我们可以创建一个大根堆,每次都将堆顶的元素取出来进行减半,当减到总和一半的时候,就退出

代码如下:

class Solution {
public:int halveArray(vector<int>& nums) {priority_queue<double> heap;//默认大根堆double sum = 0;for(auto e : nums) heap.push(e), sum+=e;double n = sum; int in = 0; sum /= 2;while(n > sum){double a = heap.top();heap.pop();n -= a/2;heap.push(a/2);in++;}return in;}
};

leetcode 179.最大数

这道题目算不上难,由于我们是将数字以字符串的形式拼接起来,所以我们就应该先对其排个序,以字符串的形式,我们直接取数字 a(假如有 30 和 8,那么字符串下的 8 是比 30 要大的,正好符合我们的要求),和数字 b,进行一个比较,看看是 a+b 的形式大一点还是 b+a 的形式大一点,因为 30 是比 3 要大的,如果直接拼接,那么303是没有330大的,所以我们需要比较

以这种方式排完序之后,直接从大到小拼接即可

这里我们可以用一个大根堆,比较前就将元素变成string类型,不用在比较的时候每一个都用上to_string,这样会块很多

当然你如果不喜欢用堆,那么直接堆原数组进行sort也可以,而博主我待会儿会将两种方法都放在下面,而我在排序的时候都是用的lambda表达式作为判断条件,这点看不懂的可以去deepseek一下

代码如下:

(一,使用堆的版本)

class Solution {
public:string largestNumber(vector<int>& nums) {auto cmp_max = [](string& a, string& b){return a+b < b+a;};priority_queue<string, vector<string> ,decltype(cmp_max)> heap(cmp_max);for(auto e : nums) heap.push(to_string(e));if(heap.top() == "0") return "0";string res;while(!heap.empty()){res += heap.top();heap.pop();}return res;}
};

(二,在原数组上直接sort的版本)

class Solution {
public:string largestNumber(vector<int>& nums) {sort(nums.begin(), nums.end(), [](int& a, int& b){return to_string(a)+to_string(b) > to_string(b)+to_string(a);});if(nums[0] == 0)return "0";string res;for(auto e : nums) res += to_string(e);return res;}
};

leetcode 376.摆动序列

这道题的贪心策略是要画图才能看出来的

我们看这张图,我们贪心的点就在于,我们可以直接找到每一个波峰和波谷,那就是我们摆动序列最长子序列的情况

试想一下,我们不选波峰的话,那么前面或者后面的数都没有波峰大,那么假如下一个波谷比我们选的数还要大的话,那么我们找到的长度就一定没有最优的情况要长

比如 5、16、30、20、27,其中 30 是波谷,假如我们不选30,选了 16,那么20对他来说就是升的情况后面的 27 就还是升,那么我们就会比最优情况长度要少

这其实就已经变相证明了这种贪心的可行性了,因为只有波峰波谷的情况是最优的,其他情况都没有这种的长度长或者最多和这种情况相等

另外还有一种情况就是相等的情况,这种,我们碰到相等的时候就跳过,判断就是判断下一个元素是否和当前元素相等,这样判断的原因是,我们在最后一个相等元素时,是不会被看作相等的,因为后面的数和他并不相等,而前面相等的数我们已经continue了,相当于只取了相等元素中的其中一个参与比较

代码如下:

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {int n = nums.size();if(n < 2) return n;int left = 0, right = 0, count = 0;for(int i = 0; i < n-1; i++){right = nums[i+1] - nums[i];if(!right) continue;if(left * right <= 0) count++;left = right;}return count+1;}
};

leetcode 300.最长递增子序列

如果你想要学会这道题目的贪心策略的话,那么你需要先把dp版本的给学会先,因为这道题目的贪心策略就是根据dp推出来的(dp就是动态规划),另外,还需要学会二分查找,不然的话时间复杂度和dp是一样的都是O(n^2),用了二分查找之后就是O(logN * N)

首先回顾一下dp版本,我们状态表示是以 i 位置为结尾,我们前面所有位置中最最长的递归子序列的长度是多少

也就是说,我们只关注那个递增子序列的最后一个元素,这个是关键,如果比这个最后一个元素大,那么我们就可以将这个元素接到后面,这个递增子序列的长度也就可以+1

所以我们可以创建一个数组,里面的每一个元素都代表以这个元素为结尾的递增子序列

然后,我们假设元素一和二分别是 7、2、6

那么我们先将 7 放入数组中,然后体现我们贪心的地方来了,我们选到 2 的时候,可以跟在 7 后面的元素,一定可以跟在 2 后面,所以我们就将 7 替换成 2

接着是 6,我们发现 6 是可以接在 2 后面的,所以我们就直接将 6 放在数组的第二个位置

可能有人看到这里还是不明白,我就总结一下,首先,这个贪心最终得出来的长度肯定是对的,但是里面的每一个元素大概率不是我们最优情况的元素

这是因为,我们见到小的就更新,大的就往后走的本质是,能接在情况A的数字,一定能接在情况B后面,这是一个一直在更新的,假如我数组中放的是 2、7、16,这代表的是三个不同的序列的结尾,16代表的是前面所有情况中长度为 3 的递增子序列的结尾位置的值,假设我先来来了一个数字 10 要来代替他,这就说明前面有情况(假设是2、7、10)这种情况和 2、7、16 的长度一样,都是 3,但是假如我下一个数字是 13 的话,接在 10 的后面能变成长度为 4 的情况,但是却不能接在 16 后面,前面两个元素(2、7)一直在更新代表的是后面的有长度也为 1 或者 2 的更优的情况,所以代表的是后面的序列

所以如果数组中后面的元素更新了的话,代表遍历到后面的时候,有更优但是长度相同的情况能代替这种情况

所以,还是那句话,dp中的是只关注最后一个元素的,我们这里也是一样,只用关注最后一个元素即可

最后,是我们二分查找算法的带入

我们将元素放入新开辟的数组中的时候,如果元素很多的话,那么我们还需要对这个数组遍历一遍,那其实就是 O(N^2) 的时间复杂度,但是这里面的数字是严格递增的,所以我们可以使用二分查找,在 O(logN * N) 的时间复杂度内解决这道题目

代码如下:

class Solution {
public:int lengthOfLIS(vector<int>& nums) {vector<int> arr;arr.push_back(nums[0]);for(int i = 1; i < nums.size(); i++){if(nums[i] > arr.back())arr.push_back(nums[i]);else{int left = 0, right = arr.size()-1;while(left < right){int mid = (left + right) >> 1;if(arr[mid] < nums[i]) left = mid + 1;else right = mid; }arr[left] = nums[i];}}    return arr.size();}
};

leetcode 334.递增的三元子序列

这道题目不解释,就是上一道题目的简化版本,甚至都不需要新开辟数组和二分查找,只需要两个变量,如果有可以接在第二个变量后面的情况,就代表有三个元素的情况,那么直接return true 即可

代码如下:

class Solution {
public:bool increasingTriplet(vector<int>& nums) {int a = nums[0], b = INT_MAX;for(int i = 1; i < nums.size(); i++){if(nums[i] > b) return true;else if(nums[i] <= a) a = nums[i];else b = nums[i];}return false;}
};

leetcode 674.最长连续递增序列

对于这道题目,我们只需要知道一个点,就是,我现在有一个数,他比前面一个数要大,那么我就可以接在他后面,长度就应该是当前的最长长度

但是如果这个数,比前面的数要小,因为是连续的,这就意味着他只能从 1 开始(自身长度为 1),作为一个新的起点开始计数

可以想象一下,就相当于这个数组被分成了一个一个的小部分,互不相交,我们只需要找出这里面的最长的长度即可

代码如下:

class Solution {
public:int findLengthOfLCIS(vector<int>& nums) {int ret = INT_MIN;int count = 1;for(int i = 1; i < nums.size(); i++){if(nums[i] > nums[i-1]) count++;else{ret = max(ret, count);count = 1;}}    ret = max(ret, count);return ret;}
};

leetcode 121.买卖股票的最佳时机

当我们往后遍历的时候,我们已经知道前面所有元素中最小的元素是哪个了(定义一个变量,找到一个元素就比较一下就能找到前面所有元素中最小的那一个)

然后我们只需用    当前元素 - 最小值,得出来一个利润,找到最大利润即可

这题这样做是因为,我们只有一次交易机会

或者我们可以换一个思路,当我们将股票数据以折线图的形式画出来的时候,我们是能看到最低的波峰和最高的波谷的,将这两个对于位置的数字相减之后得到的就是结果,因为没有其他可能会比这个结果要大了

代码如下:

class Solution {
public:int maxProfit(vector<int>& prices) {int min_val = prices[0], ret = INT_MIN;if(prices.size() == 1) return 0;for(int i = 1; i < prices.size(); i++){ret = max(prices[i] - min_val, ret);min_val = min(prices[i], min_val);}    return ret < 0 ? 0 : ret;}
};

leetcode 122.买卖股票的最佳时机Ⅱ

我们所有的股票问题其实都能用dp来做,但不一定都可以用贪心,只不过贪心的情况代码会更好写,思路会更清晰,关键是,时间复杂度也会更低

这一题的关键词是,我们有无数次交易的机会,我们要的是最大的利润

那换一个角度想,我们要最大利润,那么我们是不是只要有利可图,我就直接交易

画成折线图就是:

我们图中的每一个上升的地方,都代表着利润,那么我们要利润最大,那就将这些利润全部加起来即可,这就是最大利润的情况了

然后如果是相等的情况,我们判不判断都无所谓,因为不判断,也就是加上一个利润为 0 的情况而已,并无变化,但是博主我还是判断了,也算是强迫症吧......

代码如下:

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();if(n == 0 || n == 1) return 0;int left = prices[0], right = INT_MAX;int ret = 0;for(int i = 1; i < n-1; i++){right = prices[i];if(prices[i] == prices[i+1]) continue;else if(prices[i] > left && prices[i] > prices[i+1]){ret += (right - left);left = right;}else if(prices[i] < left && prices[i] < prices[i+1])left = right;}    if(left < prices[n-1]) ret += prices[n-1] - left;return ret;}
};

leetcode 1005.K次取反后最大化的数组和

这道题目其实没什么好讲的,因为我们的贪法就是一直对最小的那个数进行操作(前提是这个数为负数)

所以我们可以先对这个数组进行一个排序,默认的升序即可

然后在最前面的数字都是最小的数字,我们只需要判断,这个数字是否是负数,如果是的话就将这个数转换成整数,并且 k--,而如果 k 已经减小到 0 了或者这个数组里面已经没有负数了,我们就需要退出了

出来之后我们还需要进行一次排序,因为我们有可能会这样:

-5、-3、0、2、5          k=1

5、-3、0、2、5           k=0

我们会发现有负数就在中间,再次排序其实就是更新一下数组而已

然后我们就需要判断了,如果 k 还有的话,那就意味着数组里面必然没有负数了,因为有负数的话会 k-- 然后转化为正数,所以我们就可以再进行一次分类讨论,也就是 k 是奇数还是偶数

如果是奇数,那么前面所有的偶数次我们都可以对同一个元素使用,最后一次我们只能对最小的那个元素使用,所以就是所有元素相加之后减去两个第一个元素(当然你也可以在相加的时候不加第一个元素,然后减的时候只减一次即可)

然后是 k 为偶的情况,我们直接数组内全部相加即可

接着如果 k 已经没了,也是只需要将数组里面所有元素相加即可

代码如下:

class Solution {
public:int largestSumAfterKNegations(vector<int>& nums, int k) {int n = nums.size();sort(nums.begin(), nums.end());for(int i = 0; i < n; i++){if(k == 0 || nums[i] >= 0) break;if(nums[i] < 0) nums[i] = -1 * nums[i], k--;}    int sum = 0, flag = 0;sort(nums.begin(), nums.end());for(auto e : nums) {sum += e;if(e == 0) flag = 1;}if(k == 0) return sum;else{if(k % 2 == 1 && flag == 0) return sum -= 2*nums[0];else return sum;}return 0;}
};

今天这篇博客到这里就结束啦~( ̄▽ ̄)~*

如果觉得对你有帮助的话,希望可以关注一下喔

另外,博主还会尽快更新中和下,届时会将链接放到这篇文章之中,觉得讲得好的也可以关注一下喔

最后,如果你有什么疑问,可以直接私信我或者在评论区留言,博主看到了的话一定会为你答疑的

相关文章:

【算法学习计划】贪心算法(上)

目录 前言&#xff08;什么是贪心&#xff09; leetcode 860.柠檬水找零 leetcode 2208.将数组和减半的最少操作次数 leetcode 179.最大数 leetcode 376.摆动序列 leetcode 300.最长递增子序列 leetcode 334.递增的三元子序列 leetcode 674.最长连续递增序列 leetcode …...

Linux 目录结构(文件系统结构)示例说明

在Linux操作系统中&#xff0c;文件系统的结构是理解系统性能及管理的重要基础。每个目录都有它的特定用途&#xff0c;这使得系统管理更加清晰和高效。本文将带您逐步了解每一个重要目录及其功能。 1. 根目录 / 根目录是Linux文件系统的起点&#xff0c;所有文件和目录均从此…...

Linux下的socket演示程序2

server.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h>#define SER_PORT 8888 //服务器端口号 #define SER_IP "10.148.4.168" //服…...

TiDB与Doris实操对比:深度剖析数据库选型要点

TiDB与Doris实操对比&#xff1a;深度剖析数据库选型要点 宝子们&#xff0c;在大数据处理的广阔天地里&#xff0c;TiDB和Doris都是备受瞩目的数据库解决方案。它们各自有着独特的优势和适用场景&#xff0c;对于我们开发者来说&#xff0c;深入了解它们的实操特性&#xff0…...

How to install vmware workstation pro on Linux mint 22

概述 VMware 是一家专注于虚拟化技术和云计算解决方案的全球领先软件公司&#xff0c;成立于1998年&#xff0c;总部位于美国加州。它的核心技术是通过“虚拟化”将一台物理计算机的硬件资源&#xff08;如CPU、内存、存储等&#xff09;分割成多个独立的虚拟环境&#xff08;…...

redis常用部署架构之redis分片集群。

redis 3.x版本后开始支持 作用&#xff1a; 1.提升数据读写速度 2..提升可用性 分片集群就是将业务服务器产生的数据储存在不同的机器上。 redis分片集群的架构 如上图所示&#xff0c;会将数据分散存储到不同的服务器上&#xff0c;相比于之前来说&#xff0c;redis要处…...

vim的一般操作(分屏操作) 和 Makefile 和 gdb

目录 一. vim的基本概念 二. vim基础操作 2.1 插入模式 aio 2.2 [插入模式]切换至[正常模式] Esc 2.3[正常模式]切换至[末行模式] shift ; 2.4 替换模式 Shift R 2.5 视图&#xff08;可视&#xff09;模式 (可以快速 删除//注释 或者 增加//注释) ctrl v 三&…...

DeepSeek 为何能在短时间内超过 ChatGPT?—— 技术变革与成本重构的双重胜利

2025 年 1 月 27 日&#xff0c;全球科技圈见证了一个历史性时刻&#xff1a;中国 AI 公司深度求索&#xff08;DeepSeek&#xff09;开发的同名应用&#xff0c;首次登顶美国苹果 App Store 免费下载榜&#xff0c;超越了长期霸榜的 ChatGPT。这一突破不仅打破了美国科技公司在…...

Wireshark学习

Wireshark简介 抓包前 1.打开wireshark得到下面的界面 2.选择菜单栏上捕获-> 选项&#xff0c;勾选WLAN网卡&#xff08;这里需要根据各自电脑网卡使用情况选择&#xff0c;简单的办法可以看使用的IP对应的网卡&#xff09;。点击开始。启动抓包。 3.wireshark启动后&am…...

我的创作纪念日——三周年

大家好&#xff0c;心心念念的三年之气已到&#xff0c;但是我似乎对于博客专家的身份没有那么渴望了哈哈。虽然最近比较忙&#xff0c;但是看到三周年纪念日的通知&#xff0c;还是想写一点什么&#xff0c;并不是因为三周年有多么值得纪念&#xff0c;而是这段时间确实有一些…...

Softmax 回归 + 损失函数 + 图片分类数据集

Softmax 回归 softmax 回归是机器学习另外一个非常经典且重要的模型&#xff0c;是一个分类问题。 下面先解释一下分类和回归的区别&#xff1a; 简单来说&#xff0c;分类问题从回归的单输出变成了多输出&#xff0c;输出的个数等于类别的个数。 实际上&#xff0c;对于分…...

基于云服务器的数仓搭建-hive/spark安装

mysql本地安装 安装流程&#xff08;内存占用200M&#xff0c;升至2.1G&#xff09; # 将资料里mysql文件夹及里面所有内容上传到/opt/software/mysql目录下 mkdir /opt/software/mysql cd /opt/software/mysql/ # 待上传文件 install_mysql.sh mysql-community-client-8.0.3…...

YOLO历代发展 图像增强方式 架构

YOLO1 YOLOV5 数据增强 mosaic 仿射变换(Affine)、透视变换(Perspective) 网络搭建...

Spring AI Alibaba EmbeddingModel使用

一、嵌入模型 (Embedding Model)简介 1、核心概念 嵌入模型&#xff08;EmbeddingModel&#xff09;是嵌入过程中采用的模型。 当前 EmbeddingModel的接口主要用于将文本转换为数值向量&#xff0c;接口的设计主要围绕这两个目标展开&#xff1a; 可移植性&#xff1a; 该接口…...

C++入门五式——类和对象(下)

目录 再探构造函数——初始化列表 类型转换 static成员 友元函数 内部类 匿名对象 再探构造函数——初始化列表 之前我们实现构造函数时&#xff0c;初始化成员变量主要使用函数体内赋值&#xff0c;构造函数初始化还有一种方式&#xff0c;就是初始化列表。 //初始化列…...

Spring的SPEL(Spring Expression Language)的使用说明,包含语法、示例和常见场景

以下是Spring的SPEL&#xff08;Spring Expression Language&#xff09;的使用说明&#xff0c;包含语法、示例和常见场景&#xff1a; 1. 基本语法 变量引用 表达式&#xff1a;#{变量名}&#xff08;如#{systemProperties[os.name]}&#xff09;作用域&#xff1a;在Sprin…...

Linux应用:线程进阶

线程同步之信号量 信号量&#xff08;Semaphore&#xff09;是一个整型的计数器&#xff0c;用于控制对共享资源的访问。它通过 PV 操作来实现同步&#xff0c;P 操作将信号量的值减 1&#xff0c;如果值小于 0 则线程阻塞&#xff1b;V 操作将信号量的值加 1&#xff0c;如果…...

策略模式 (Strategy)

策略模式 (Strategy) 应用场景&#xff1a;用于处理不同的任务配置参数。在你的任务中&#xff0c;可能会有不同的任务类型&#xff0c;每个任务类型可能有不同的单位&#xff08;比如米、毫米&#xff09;或不同的处理方式。策略模式可以让你根据不同的任务类型选择不同的处理…...

【YOLOv8】YOLOv8改进系列(10)----替换主干网络之UniRepLKNet

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f341;YOLOv8入门改进专栏&#x1f341; &#x1f341;如果再也不能见到你&#xff0c;祝你早安&#xff0c;午安&#xff0c;晚安&#x1f341; 【YOLOv8改进系列】&#xff1a; YOLOv8改进系列&#xff0…...

mathtype一些用法总结

1.一个是公式旁边加入||&#xff0c;一般使用键盘直接打入的会比较小&#xff0c;mathtype中的会好看很多&#xff0c;打开这个栏目&#xff0c;会看到有很多。 2.另外是带^符号&#xff0c;在字符上面带没有办法直接带&#xff0c;所以可以在mathtype中先加帽子&#xff0c;然…...

1、SQL注入攻击的防范

原文地址: SQL注入攻击的防范 更多内容请关注&#xff1a;代码安全 PHP安全编码——书写安全的代码 1、SQL注入攻击的防范 提问 问题1&#xff1a;什么是SQL注入攻击&#xff1f; 问题2&#xff1a;有几种简单方法防范SQL注入攻击&#xff1f; 问题3&#xff1a;mys…...

核心知识——论文总结

引入 本文我们会针对论文中的核心内容进行总结&#xff0c;加深小伙伴对于Spark的理解。而通过Spark的论文&#xff0c;重点需要掌握理解如下内容&#xff1a; Spark 里核心的 RDD 是一个什么概念&#xff0c;它是通过什么方式来优化分布式数据处理的&#xff0c;它的设计思路…...

HTTP 核心知识点整理

1. HTTP 基础 ​定义&#xff1a;HTTP&#xff08;HyperText Transfer Protocol&#xff09;是应用层协议&#xff0c;基于 ​请求-响应模型&#xff0c;用于客户端&#xff08;浏览器&#xff09;与服务器之间的通信。​特点&#xff1a; ​无状态&#xff1a;每次请求独立&a…...

什么是矩阵账号

矩阵账号是指在同一平台或多个平台上&#xff0c;围绕同一品牌或个人&#xff0c;创建的多个相互关联、协同工作的账号组合。这些账号虽然独立&#xff0c;但在内容定位和运营策略上有所区分&#xff0c;同时又相互引流&#xff0c;共同形成一个网络结构&#xff0c;类似于矩阵…...

【6】VS Code 新建上位机项目---项目分层

【6】VS Code 新建上位机项目---项目分层 1 项目分层(layer)2 项目分层实现数据插入SQL3 项目分层实现 (实体类封装参数)4 项目分层的实现SQL查询数据1 项目分层(layer) 表示层(UI):与用户交互使用。比如按钮,输入信息等;业务层(BLL):传递数据,业务逻辑。根据用户需…...

EspressoSample深度解析:在CircleCI上高效运行Android UI测试

项目背景与简介 EspressoSample项目位于GitHub上的circleci/EspressoSample仓库&#xff0c;该项目旨在展示如何在CircleCI平台上配置和使用Espresso进行Android应用的UI测试。 项目结构与环境准备 项目结构 EspressoSample项目遵循典型的Android项目结构&#xff0c;包含a…...

【每日论文】MetaSpatial: Reinforcing 3D Spatial Reasoning in VLMs for the Metaverse

下载PDF或查看论文&#xff0c;请点击&#xff1a; LlamaFactory - huggingface daily paper - 每日论文解读 | LlamaFactory | LlamaFactory探索LlamaFactory&#xff0c;为你解读AI前沿技术文章&#xff0c;快速掌握最新技术动态https://www.llamafactory.cn/daily-paper/de…...

mac m4 Homebrew安装MySQL 8.0

1.使用Homebrew安装MySQL8 在终端中输入以下命令来安装MySQL8&#xff1a; brew install mysql8.0 安装完成后&#xff0c;您可以通过以下命令来验证MySQL是否已成功安装&#xff1a; 2.配置mysql环境变量 find / -name mysql 2>/dev/null #找到mysql的安装位置 cd /op…...

Java关于多态

多态 字面意思&#xff1a;对象的多种形态。 Student(子类)<-Person(父类)->Teacher(子类) Student snew Student(); 学生形态 对象 代表用new创建一个学生对象赋值给Student 类型&#xff0c;代表Student类型(学生对象)现在是学生形态。 有了多态之后&#xff…...

K8S学习之基础四十六:k8s中部署Kibana

部署kibana组件 上传kibina镜像到harbor 部署kibana组件&#xff0c;包括svc和deplomentvi kibana.yaml apiVersion: v1 kind: Service metadata:name: kibananamespace: kube-logginglabels:app: kibana spec:ports:- port: 5601selector:app: kibana --- apiVersion: apps/…...

如何快速对比两个不同的excel文件中的单元格的数据是否完全相同 并把不同的单元格的背景颜色更改为红色?

要快速对比两个不同的Excel文件中的单元格数据是否完全相同&#xff0c;并将不同的单元格背景颜色更改为红色&#xff0c;可以使用Excel的以下几种方法&#xff1a; 方法一&#xff1a;使用条件格式 打开两个Excel文件。将一个文件的内容复制到另一个文件的新工作表中&#x…...

基于Python+LanceDB实战向量搜索

本篇实战演示向量搜索的实现和示例。 预期效果 给出一个查询的字符串&#xff0c;通过向量搜索&#xff0c;在下面三个语句中搜索出关联性最大的那句。 "熊猫是中国的国宝&#xff0c;主要栖息在四川山区。","长城是古代中国建造的军事防御工事&#xff0c;全…...

多路转接epoll

目录 一、为什么epoll最高效&#xff1f; 二、epoll的三个系统调用 三、理解epoll模型 四、epoll的优点 五、epoll的使用示例 六、epoll的工作模式 ET模式和LT模式的对比 七、epoll的使用场景 总结 一、为什么epoll最高效&#xff1f; 按照 man 手册的…...

AI编程工具哪家强?对比Cusor、Copilot、Cline

前言 AI最先革谁的命&#xff1f;刚毕业参加工作的那个时候就在想是否可以开发一个程序让它自己写代码&#xff0c;在那个遥远的年代&#xff0c;这种想法仿佛就是天方夜谭。但是今天大模型的出现让理想成为了现实。回答前面的问题&#xff0c;AI最先革谁的命&#xff0c;最聪…...

[FPGA基础学习]实现流水灯与按键暂停

FPGA实现LED流水灯 1.vscode的安装和使用 vscode下载 Visual Studio Code - Code Editing. Redefined vscode插件&#xff08;Verilog-HDL/SystemVerilog&#xff09;下载 quartus绑定vscode 2.用6个LED完成周期为1秒的跑马灯效果 流水灯模块设计 时钟输入 DE2-115开发板…...

刷题记录(LeetCode 994.腐烂的橘子)

在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元格中没有…...

ECharts折线图源码合集1(共18个自定义图表),附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我整理了18个自定义折线图图表&#xff0c;不仅对每个图表代码进行了精简优化&#xff0c;剥离冗余配置项&#xff0c;…...

SQL小菜之TOP N查找问题

前言 SQL的编写是后端面试中非常常见&#xff0c;其中TOP N查找问题也是高频出现的问题&#xff0c;今天我们来看两道SQL TOPN问题。 问题 我们有一张雇员表Employee&#xff1a; CREATE TABLE Employee (id int DEFAULT NULL,salary int DEFAULT NULL,department varchar(…...

蓝桥杯 临时抱佛脚 之 二分答案法与相关题目

二分答案法&#xff08;利用二分法查找区间的左右端点&#xff09; &#xff08;1&#xff09;估计 最终答案可能得范围 是什么 &#xff08;2&#xff09;分析 问题的答案 和 给定条件 之间的单调性&#xff0c;大部分时候只需要用到 自然智慧 &#xff08;3&#xff09;建…...

Css环形旋转立体感动画

Css环形旋转立体感动画 index.html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>Css环形旋转立体感动画</title><link rel"stylesheet" href"./style.css">&l…...

音乐极客指南:Melody高音质私有云音乐平台本地部署方案

文章目录 前言1. 添加镜像源2. 本地部署Melody3. 本地访问与使用演示4. 安装内网穿透5. 配置Melody公网地址6. 配置固定公网地址 前言 嘿&#xff0c;各位音乐爱好者们&#xff01;今天我要带大家玩个大招——在香橙派Zero3上搭建你的专属在线音乐平台&#xff0c;还能通过cpo…...

Microi吾码界面设计引擎之基础组件用法大全【内置组件篇·中】

&#x1f380;&#x1f380;&#x1f380; microi-pageengine 界面引擎系列 &#x1f380;&#x1f380;&#x1f380; 一、Microi吾码&#xff1a;一款高效、灵活的低代码开发开源框架【低代码框架】 二、Vue3项目快速集成界面引擎 三、Vue3 界面设计插件 microi-pageengine …...

# WebSocket 与 Socket.IO 对比与优化

核心概念对比 WebSocket 协议性质&#xff1a;HTML5 提供的全双工通信协议 (RFC 6455)连接方式&#xff1a;基于 TCP 的低层协议通信模式&#xff1a;持久化连接&#xff0c;服务端可主动推送协议升级&#xff1a;通过 HTTP 101 状态码切换协议 Socket.IO 协议性质&#xf…...

vue3中,route4,获取当前页面路由的问题

首先应用场景如下&#xff1a; 在main.js里面&#xff0c;引入的是路由的配置文件&#xff0c;如下&#xff1a; import {router} from /router; app.use(router); 路由配置文件router.js如下&#xff1a; import { createRouter, createWebHistory } from vue-router; imp…...

python将整个txt文件写入excel的一个单元格?

要将整个txt文件写入Excel的一个单元格&#xff0c;可以使用Python的openpyxl库来实现。以下是一个简单的示例代码&#xff1a; from openpyxl import Workbook# 读取txt文件内容 with open(file.txt, r) as file:txt_content file.read()# 创建一个新的Excel工作簿 wb Work…...

日志2333

Pss-9 这一关考察的是时间盲注 先练习几个常见命令语句&#xff1a; select sleep(5);--延迟5s输出结果 if &#xff08;1>0,ture,false&#xff09;;--输出‘ture’ /if &#xff08;1<0,ture,false&#xff09;;--输出‘false’ select ascii()/select ord()返回字…...

用Deepseek写扫雷uniapp小游戏

扫雷作为Windows系统自带的经典小游戏&#xff0c;承载了许多人的童年回忆。本文将详细介绍如何使用Uniapp框架从零开始实现一个完整的扫雷游戏&#xff0c;包含核心算法、交互设计和状态管理。无论你是Uniapp初学者还是有一定经验的开发者&#xff0c;都能从本文中获得启发。 …...

C++中的异常和智能指针

一、C中的异常 1.1C语言中关于错误的处理&#xff08;回顾&#xff09; 1.1.1处理一&#xff1a;文件中的错误码&#xff0c;错误信息 C语言中&#xff0c;文件打开成功则返回地址&#xff0c;不成功返回0 FILE* foutfopen("Test.txt","r"); cout<&…...

Selenium 简单入门操作示例

最简单的 Selenium 示例&#xff08;Python版&#xff09; 下面是一个完整的、最简单的 Selenium 操作示例&#xff0c;带你快速上手&#xff1a; from selenium import webdriver from selenium.webdriver.common.by import By import time# 1. 启动浏览器&#xff08;这里使…...

6.1 模拟专题:LeetCode 1576. 替换所有的问号

1. 题目链接 LeetCode 1576. 替换所有的问号 2. 题目描述 给定一个仅包含小写字母和问号 ? 的字符串 s&#xff0c;要求将所有 ? 替换为任意小写字母&#xff0c;使得替换后的字符串中 没有相邻的两个字符相同。 示例&#xff1a; 输入&#xff1a;s "?zs" →…...