【算法】经典算法题

文章目录

  • 专题一:双指针
    • 1. 移动零
    • 2. 复写零
    • 3. 快乐数
    • 4. 盛最多水的容器
    • 5. 有效三角形的个数
    • 6. 查找总价格为目标值的两个商品
    • 7. 三数之和
    • 8. 四数之和
  • 专题二:滑动窗口
    • 1. 长度最小的子数组
    • 2. 无重复字符的最长字串
    • 3. 最大连续1的个数 III
    • 4. 将 x 减到 0 的最小操作数

专题一:双指针


1. 移动零


在这里插入图片描述

题目解析
在这里插入图片描述

算法原理
在这里插入图片描述

代码编写

// 写法一
class Solution 
{
public:void moveZeroes(vector<int>& nums) {// 1、下标初始化int dest = -1, cur = 0;// 2、数组划分while(cur < nums.size()){if(nums[cur]) swap(nums[++dest], nums[cur++]);else ++cur;}}
};// 写法二
class Solution 
{
public:void moveZeroes(vector<int>& nums) {for(int dest = -1, cur = 0; cur < nums.size(); ++cur)if(nums[cur]) // 处理 非0 元素swap(nums[++dest], nums[cur]);}
};/*
- 时间复杂度:O(n)
- 空间复杂度:O(1)
*/

2. 复写零


在这里插入图片描述

算法原理
在这里插入图片描述

代码编写

class Solution 
{
public:void duplicateZeros(vector<int>& nums) {// 1、初始化int dest = -1, cur = 0, n = nums.size();// 2、找到最后一个复写的数while(true){if(nums[cur]) dest += 1;else dest += 2;if(dest >= n - 1) break;++cur;}cout << nums[cur] << endl;// 1.5、预处理 -> 让 dest 的下标有效if(dest == n){if(nums[cur]) --cur, --dest;else {nums[n - 1] = 0;dest -= 2;cur -= 1;}}// 2、双指针从后往前进行复写操作while(cur >= 0){if(nums[cur]) nums[dest--] = nums[cur--];else{nums[dest--] = 0;nums[dest--] = 0;cur--;} }}
};
/*
- 时间复杂度:O(n)
- 空间复杂度:O(1)
*/

3. 快乐数


在这里插入图片描述

算法原理
在这里插入图片描述

代码编写

class Solution 
{
private:// 计算每个位置上的数字的平方和inline static int BitSum(int num){int ret = 0;while(num){int t = num % 10;ret += t * t;num /= 10;}return ret;}public:bool isHappy(int n) {int slow = n, fast = BitSum(n);while(slow != fast){slow = BitSum(slow);fast = BitSum(BitSum(fast));}return slow == 1;}
};

4. 盛最多水的容器


在这里插入图片描述

算法原理
在这里插入图片描述

代码编写

class Solution 
{
public:int maxArea(vector<int>& height) {int left = 0, right = height.size() - 1;int ret = INT_MIN;while(left != right){// 容积 = 长度 * 高度int v = (right - left) * min(height[left], height[right]);ret = max(ret, v);// 移动指针 - 谁小移动谁height[left] < height[right] ? ++left : --right;}return ret;}
};
/*
- 时间复杂度:O(n)
- 空间复杂度:O(1)
*/

5. 有效三角形的个数


在这里插入图片描述

算法原理
在这里插入图片描述

代码编写

class Solution 
{
public:int triangleNumber(vector<int>& nums) {// 1、优化sort(nums.begin(), nums.end());// 2、利用双指针解决问题int ret = 0, n = nums.size();for(int i = n - 1; i >= 2; --i){int left = 0, right = i - 1;while(left < right){// 当 a+b>c ,a下标属于 [left, right-1]时,都能和 b、c 构成三角形// 当 a+b<=c ,b下标属于[left-1, right]时,都不能和 a、c 构成三角形if(nums[left] + nums[right] > nums[i]){ret += right - left;--right;}else ++left;}}// 返回值return ret;}
};/*
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
*/

6. 查找总价格为目标值的两个商品


在这里插入图片描述

算法原理
在这里插入图片描述

代码编写

class Solution 
{
public:vector<int> twoSum(vector<int>& price, int target) {// 1、数据初始化int left = 0, right = price.size() - 1;// 2、利用双指针解决问题while(left < right){int sum = price[left] + price[right];if(sum < target) ++left;else if(sum > target) --right;else return {price[left], price[right]};}// 题目没有明确说明没有结果的话会怎么样,那么该题的测试用例应该都是有结果的// 为了照顾编译器要求一定要返回一个结果,所以我们最后返回一个空数组即可return {};}
};
/*
- 时间复杂度:O(n)
- 空间复杂度:O(1)
*/

7. 三数之和


在这里插入图片描述

算法原理
在这里插入图片描述

代码编写

class Solution 
{
public:vector<vector<int>> threeSum(vector<int>& nums) {// 1、初始化int n = nums.size();vector<vector<int>> ret;// 2、排序sort(nums.begin(), nums.end());// 3、依次固定一个数for(int i = 0; i < n - 2;){// 4、双指针算法找到两数之和等于 aim 的元素int left = i + 1, right = n - 1, aim = -nums[i];while(left < right){int sum = nums[left] + nums[right];if(sum < aim) ++left;else if(sum > aim) --right;else {ret.push_back( {nums[i], nums[left], nums[right]} );++left, --right; // 保证 left、right 选择的元素不漏// 对 left、right 已经选择过的元素去重while(left < right && nums[left] == nums[left - 1]) ++left;while(left < right && nums[right] == nums[right + 1]) --right;}}// 保证 i 选择的元素不漏++i; // 对 i 已经选择过的元素去重while(i < n - 2 && nums[i] == nums[i - 1]) ++i;}// 5、返回最终结果return ret;}
};
/*
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
*/

8. 四数之和


在这里插入图片描述

算法原理
在这里插入图片描述

代码编写

class Solution 
{
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {// 1、初始化int n = nums.size();vector< vector<int> > ret;// 2、排序sort(nums.begin(), nums.end());// 3、依次固定一个数,然后使用“三数之和”解决问题for(int i = 0; i < n - 3;) {// 4、再依次固定一个数,然后使用“双指针”解决问题for(int j = i + 1; j < n - 2;) {int left = j + 1, right = n - 1;double aim = (double)target - nums[i] - nums[j];// 5、双指针算法找到两数之和等于 aim 的元素while(left < right){double sum = nums[left] + nums[right];if(sum < aim) ++left;else if(sum > aim) --right;else{ret.push_back( {nums[i], nums[j], nums[left], nums[right]} );++left, --right; // 保证 left、right 选择的元素不漏// 对 left、right 已经选择过的元素去重while(left < right && nums[left] == nums[left - 1]) ++left;while(left < right && nums[right] == nums[right + 1]) --right;}}// 保证 j 选择的元素不漏++j;// 对 j 已经选择过的元素去重while(j < n - 2 && nums[j] == nums[j - 1]) ++j;}// 保证 i 选择的元素不漏++i;// 对 i 已经选择过的元素去重while(i < n - 3 && nums[i] == nums[i - 1]) ++i;}// 6、返回最终结果return ret;}
};
/*
- 时间复杂度:O(n^3)
- 空间复杂度:O(1)
*/

专题二:滑动窗口


1. 长度最小的子数组


在这里插入图片描述

算法原理
在这里插入图片描述

代码编写

class Solution 
{
public:int minSubArrayLen(int target, vector<int>& nums) {// 1、初始化int n = nums.size();int minLength = INT_MAX;// 2、使用滑动窗口解决问题for(int left = 0, right = 0, sum = nums[0]; right < n;){if(sum >= target) {minLength = min(minLength, right - left + 1);sum -= nums[left++];}else {if(++right < n)sum += nums[right];}}// 3、返回值return minLength == INT_MAX ? 0 : minLength;}
};
/*
- 时间复杂度:O(n)
- 空间复杂度:O(1)
*/

2. 无重复字符的最长字串


在这里插入图片描述

算法原理
在这里插入图片描述

代码编写

class Solution 
{
public:int lengthOfLongestSubstring(string s) {// 1、初始化int n = s.size();vector<int> count(256);int left = 0, right = 0, ret = 0;// 2、滑动窗口int length = 0; //用来记录窗口长度while(right < n){if(!count[s[right]]) //进窗口{++count[s[right]];++length;++right;ret = max(ret, length); //更新结果}else //出窗口{--count[s[left]];--length;++left;}}// 3、返回值return ret;}
};
/*
- 时间复杂度:O(n)
- 空间复杂度:O(1)
*/

3. 最大连续1的个数 III


在这里插入图片描述

算法原理
在这里插入图片描述

代码编写

class Solution 
{
public:int longestOnes(vector<int>& nums, int k) {// 1、初始化int n = nums.size();int ret = INT_MIN;// 2、滑动窗口int left = 0, right = 0;int length = 0; // 当前子数组中最长连续 1 的长度int zero = 0;  // 当前子数组中 0 出现的次数while(right < n){if(nums[right] != 0) // nums[right] 非 0,此时 right 一定入窗口{ret = max(ret, ++length);++right;}else{if(zero + 1 <= k) {ret = max(ret, ++length);++zero;++right;}else{if(nums[left++] == 0)  --zero;--length;}}}// 3、返回值return ret;}
};
/*
- 时间复杂度:O(n)
- 空间复杂度:O(1)
*/

4. 将 x 减到 0 的最小操作数


在这里插入图片描述


题目解析
在这里插入图片描述


算法原理
在这里插入图片描述


代码编写

class Solution 
{
public:int minOperations(vector<int>& nums, int x) {// 1、初始化int sum = 0;for(const auto e : nums) sum += e;int target = sum - x;// 2、细节处理(数组中所有元素都大于0,所以 target 小于 0 是不存在的)if(target < 0) return -1;// 3、滑动窗口int ret = -1;for(int left = 0, right = 0, tmp = 0; right < nums.size();){// 进窗口tmp += nums[right++];// 出窗口while(tmp > target) tmp -= nums[left++];// 更新结果if(tmp == target) ret = max(ret, right - left);}// 4、返回结果return ret == -1 ? ret : nums.size() - ret;}
};
/*
- 时间复杂度:O(n)
- 空间复杂度:O(1)
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/165891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生技术演进之路-(云技术如何一步步演进的,云原生解决了什么问题?)

云技术如何一步步演进的&#xff1f; 云原生解决了什么问题&#xff1f; 物理设备 电脑刚被发明的时候&#xff0c;还没有网络&#xff0c;每个电脑&#xff08;PC&#xff09;&#xff0c;就是一个单机。 这台单机&#xff0c;包括CPU、内存、硬盘、显卡等硬件。用户在单机…

电线电缆、漆包线工厂开源MES/生产管理系统/云MES

万界星空科技专业的漆包线MES系统功能介绍&#xff1a; 从原材料出入库-拉丝机等设备管理-漆包线称重打印系统自动入库&#xff08;支持多台秤同时称重&#xff09;-建立销售报价、销售订单-生产订单-支持扫码出库及自动拣货出库-应收应付账款-对接各种其他系统及财务系统。 …

便携式水污染物监测设备的招标参数有哪些

便携式多参数水质检测仪参数特点&#xff1a; 便携式多参数水质检测仪参数特点&#xff1a; 便携式多参数水质快速测定仪&#xff0c;根据国家检测标准&#xff08;G B &#xff09; 及环境部检测标准(H J &#xff09;研发生产&#xff0c;本仪器具有检测快速、操作简单、测试…

综合实力盘点高性价比还优质的云服务器:亚马逊云科技仍然领跑市场

如果说云计算是一条流向数字化未来的河流&#xff0c;那亚马逊云科技毫无疑问是航行在最前面的帆船&#xff1b;如果说云计算是一条通往数字化未来的铁轨&#xff0c;那亚马逊云科技就是行驶在最前面的高铁。接下来回首往昔&#xff0c;以史为镜&#xff0c;得出云服务器哪家便…

毛里塔尼亚市场开发攻略,收藏一篇就够了

毛里塔尼亚是非洲西北部的一个国家&#xff0c;也是中国长期援建的一个国家&#xff0c;也是一带一路上的国家。毛里塔尼亚生产生活资料依赖进口&#xff0c;长期依赖跟我们国家的贸易关系也是比较紧密的&#xff0c;今天就来给大家介绍一下毛里塔尼亚的市场开发公路。文章略长…

Python监控服务进程及自启动服务方法与实践

1. 需求概述 当我们在Windows Server环境中部署XX系统的实际应用中&#xff0c;往往会遇到一些运维管理的挑战。为了确保系统的持续稳定运行&#xff0c;特别是在服务程序因各种原因突然关闭的情况下&#xff0c;我们可以借助Python的强大生态系统来构建一个监控与自动重启的管…

分布式链路追踪入门篇-基础原理与快速应用

为什么需要链路追踪&#xff1f; 我们程序员在日常工作中&#xff0c;最常做事情之一就是修bug了。如果程序只是运行在单机上&#xff0c;我们最常用的方式就是在程序上打日志&#xff0c;然后程序运行的过程中将日志输出到文件上&#xff0c;然后我们根据日志去推断程序是哪一…

Comsol Multiphysics 6.2 for Mac建模仿真软件

COMSOL Multiphysics是一款多物理场仿真软件&#xff0c;旨在帮助工程师、科学家和研究人员解决各种复杂的工程和科学问题。该软件使用有限元分析方法&#xff0c;可以模拟和分析多个物理场的相互作用&#xff0c;包括结构力学、热传导、电磁场、流体力学和化学反应等。 COMSOL…

一些好用的前端小插件(转自知乎)

一些好用的前端小插件&#xff08;2&#xff09; 1. cropper.js Cropper.js 2.0 是一系列用于图像裁剪的 Web 组件。 官网地址&#xff1a;https://fengyuanchen.github.io/cropperjs/v2/zh/ 2. Vditor Vditor是一款浏览器端的 Markdown 编辑器&#xff0c;支持所见即所得、…

2024年度投资策略:AI大模型和半导体国产化加速

今天分享的是AI系列深度研究报告&#xff1a;《2024年度投资策略&#xff1a;AI大模型和半导体国产化加速》。 &#xff08;报告出品方&#xff1a;东方证券&#xff09; 报告共计&#xff1a;48页 前言: 行情回顾与未来展望 电子板块涨幅转正&#xff0c;信心逐渐回归。截至…

git的使用记录

GitHub是公有的远程仓库&#xff0c;Gitlab是私有的远程仓库。 git add file git commit -m "add file" git mv filea fileb git log 显示提交记录 git log --oneline 一行的简略信息显示 git log --oneline --decorate 显示当前指针 git reset --ha…

矩阵知识补充

正交矩阵 定义&#xff1a; 正交矩阵是一种满足 A T A E A^{T}AE ATAE的方阵 正交矩阵具有以下几个重要性质&#xff1a; A的逆等于A的转置&#xff0c;即 A − 1 A T A^{-1}A^{T} A−1AT**A的行列式的绝对值等于1&#xff0c;即 ∣ d e t ( A ) ∣ 1 |det(A)|1 ∣det(A)∣…

Vim 一下日志文件,Java 进程没了?

一次端口告警&#xff0c;发现 java 进程被异常杀掉&#xff0c;而根因竟然是因为在问题机器上 vim 查看了 nginx 日志。下面我将从时间维度详细回顾这次排查&#xff0c;希望读者在遇到相似问题时有些许启发。 时间线 15:19 收到端口异常 odin 告警。 状态:P1故障 名称:应用端…

黑马点评笔记 redis实现优惠卷秒杀

文章目录 难题全局唯一IDRedis实现全局唯一Id 超卖问题问题解决方案乐观锁问题 一人一单 难题 要解决优惠卷秒杀的问题我们要考虑到三个个问题&#xff0c;全局唯一ID&#xff0c;超卖问题&#xff0c;一人一单。 全局唯一ID 用户抢购时&#xff0c;就会生成订单并保存到同一…

【git】pip install git+https://github.com/xxx/xxx替换成本地下载编译安装解决网络超时问题

目录 &#x1f311;&#x1f311; 背景 &#x1f312; &#x1f312;作用 &#x1f314;&#x1f314; 问题 &#x1f314;&#x1f314;解决方案 &#x1f319;方法一 &#x1f319;方法二 &#x1f31d;&#x1f31d;我的解决方案 整理不易&#xff0c;欢迎一键三连…

分布式篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、什么是补偿事务?二、消息队列是怎么实现的?三、那你说说Sagas事务模型前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。…

qgis添加postgis数据

左侧浏览器-PostGIS-右键-新建连接 展开-双击即可呈现 可以点击编辑按钮对矢量数据编辑后是直接入库的&#xff0c;因此谨慎使用。

企业数字化转型的作用是什么?_光点科技

在当今快速变化的商业环境中&#xff0c;数字化转型已成为企业发展的重要策略。企业数字化转型指的是利用数字技术改造传统业务模式和管理方式&#xff0c;以提升效率、增强竞争力和创造新的增长机会。 提升运营效率&#xff1a;数字化转型通过引入自动化工具和智能系统&#x…

NX二次开发UF_CSYS_ask_wcs 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_ask_wcs Defined in: uf_csys.h int UF_CSYS_ask_wcs(tag_t * wcs_id ) overview 概述 Gets the object identifier of the coordinate system to which the work coordin…

JMeter压测常见面试问题

1、JMeter可以模拟哪些类型的负载&#xff1f; JMeter可以模拟各种类型的负载&#xff0c;包括但不限于Web应用程序、API、数据库、FTP、SMTP、JMS、SOAP / RESTful Web服务等。这使得JMeter成为一个功能强大且灵活的压力测试工具。 2、如何配置JMeter来进行分布式压力测试&a…