【强化算法专题一】双指针算法

news/2024/10/28 23:37:07/

【强化算法专题一】双指针算法

  • 1.双指针算法--移动零
  • 2.双指针算法--复写零
  • 3.双指针算法--快乐数
  • 4.双指针算法--盛水最多的容器
  • 5.双指针算法--有效三角形的个数
  • 6.双指针算法--和为s的两个数
  • 7.双指针算法--三数之和
  • 8.双指针算法--四数之和

1.双指针算法–移动零

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践在这里插入图片描述

【代码:】

class Solution {
public://双指针:本质就是划分数组,数组分块
//cur:用来遍历数组,将数组分成两个部分,[o,cur-1]已经处理的部分[cur,n-1]待处理的部分
//已经处理的部分要求是什么呢?非0元素在前面,0元素在后面,那么我们利用dest指针来作为它们的分割线
//dest:已经处理的部分又被dest分割成两部分,[0,dest]是非0部分,而[dest+1,cur-1]就是0部分
//所以数组总体被分成三部分void moveZeroes(vector<int>& nums) {int cur=0;int dest=cur-1;while(cur<nums.size()){if(nums[cur]==0){//当遇到0时不需要放入des区间,因为des区间里都是非0的cur++;}else{//当遇到非0时,就需要放入des区间,放进一个元素dest就要往后挪动一下,流出位置//但不能覆盖要交换dest++;swap(nums[dest],nums[cur]);cur++;}} }
};

2.双指针算法–复写零

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践在这里插入图片描述

【代码:】

class Solution 
{
public:void duplicateZeros(vector<int>& arr){//第一步找最后一个复写的数据int cur=0,dest=-1,n=arr.size();while(cur<n){if(arr[cur])dest++;else dest+=2;//dest每次走完都要判断一下是否到头if(dest>=n-1)break;cur++;}//特殊情况处理if(dest==n){arr[n-1]=0;dest-=2;cur--;}//正常往前复写while(cur>=0){if(arr[cur])arr[dest--]=arr[cur--];else{arr[dest--]=0;arr[dest--]=0;cur--;}}}
};

3.双指针算法–快乐数

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践

在这里插入图片描述

【代码:】

class Solution 
{
public:int work(int n){int ret=0;while(n){ret+=(n%10)*(n%10);n=n/10;}return ret;}bool isHappy(int n) {int slow=n,fast=n;//判断快慢指针相遇while(slow&&fast){slow=work(slow);//慢指针每次走1次操作fast=work(work(fast));//快指针每次走2次操作if(fast==slow){if(fast==1)return true;elsereturn false;}}return false;}
};

4.双指针算法–盛水最多的容器

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践

在这里插入图片描述

【代码:】


class Solution {
public:int lower(int x,int y){if(x<y)return x;else return y;}int maxArea(vector<int>& height) {vector<int> vt;int left=0,right=height.size()-1,V=0;while(left<right){V=(right-left)*(lower(height[left],height[right]));vt.push_back(V);if(height[left]<height[right])++left;else--right;}sort(vt.begin(),vt.end());return vt[vt.size()-1]; }
};

5.双指针算法–有效三角形的个数

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践在这里插入图片描述

【代码:】

class Solution {
public:int triangleNumber(vector<int>& nums) {sort(nums.begin(),nums.end());//首先优化数组,先排序int ret=0,ci=nums.size()-1;//首先固定的是最大值while(ci>=0){int left=0,right=ci-1;//在最大值前面的区间里利用双指针算法while(left<right){if(nums[left]+nums[right]>nums[ci]){ret+=right-left;right--;}else{left++;}}ci--;}return ret;}};

6.双指针算法–和为s的两个数

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践

在这里插入图片描述

【代码:】

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {//使用双指针算法int left=0,right=nums.size()-1;while(left<right){if(nums[left]+nums[right]>target)--right;else if(nums[left]+nums[right]<target)++left;elsereturn {nums[left],nums[right]};//大括号,这样写会发生隐射类型转化,调用vector的构造函数来构造}return {-1,-1};}
};

7.双指针算法–三数之和

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践

在这里插入图片描述

【代码:】

class Solution 
{
public:vector<vector<int>> threeSum(vector<int>& nums) {//首先优化数组,对数组排序sort(nums.begin(),nums.end());//首先固定一个元素a,对后面的区间使用双指针算法,筛选//筛选的过程中要注意去重int ti=0;vector<vector<int>> vv;while(ti<nums.size()-1){//这里要有一个小优化,排完序后,0后面肯定都是正数,整数固定以后后面不可能能找到负数了//所以直接可以跳过就不用固定了if(nums[ti]>0)break;//对后面的区间使用双指针算法int left=ti+1,right=nums.size()-1,target=-nums[ti];while(left<right){if(nums[left]+nums[right]>target){right--;}else if(nums[left]+nums[right]<target){left++;}else//说明找到这个三元组了{vv.push_back({nums[ti],nums[left],nums[right]});//当找到一对满足条件的元素时,left和right要同时挪动,接下剩下的区间继续寻找//但要根据要去重,我们得注意下次如果再遇到上次的元素还是直接跳过去left++;right--;while(nums[left]==nums[left-1]&&left<right)left++;//还要注意避免越界left<rightwhile(nums[right]==nums[right+1]&&left<right)right--;}}//最后还要注意对固定的元素进行去重,因为当固定相同的元素时,也会出现重复的int later=ti;++ti;while(nums[later]==nums[ti]&&ti<nums.size()-1)//避免越界++ti;}return vv;}
};

8.双指针算法–四数之和

在这里插入图片描述

算法原理解析-------------------------------------------------------------------------------动手实践在这里插入图片描述

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> vv;//第一步给数组排序sort(nums.begin(),nums.end());//依次固定一个数a  找target-afor(int i=0;i<nums.size();){int a=nums[i];//依次固定一个数bfor(int j=i+1;j<nums.size();){int b=nums[j];long long tar=(long long)target-a-b;//在b后面的区间里使用双指针算法找  target-a-bint left=j+1,right=nums.size()-1;while(left<right){if(nums[left]+nums[right]<tar)left++;else if(nums[left]+nums[right]>tar)right--;else{vv.push_back({a,b,nums[left],nums[right]});left++;right--;//首先放入数组里,left和right各自走一步//然后检查后面的值是否有相同的,如果是相同的那就跳过while(nums[left]==nums[left-1]&&left<right)++left;while(nums[right]==nums[right+1]&&left<right)--right;}//b也要注意后面如果有相同的也要跳过}j++;while(j<nums.size()&&nums[j-1]==nums[j])j++;}i++;while(i<nums.size()&&nums[i-1]==nums[i])i++;}return vv;}
};

http://www.ppmy.cn/news/1134503.html

相关文章

基于Java的老年人体检管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

前端与后端:程序中两个不同的领域

前端和后端是构成一个完整的计算机应用系统的两个主要部分。它们分别负责不同的功能和任务&#xff0c;有以下几个方面的区别&#xff1a; 功能&#xff1a;前端主要负责用户界面的呈现和交互&#xff0c;包括网页的设计、布局、样式、动画效果和用户输入等。后端则处理网站或应…

常见变量命名方法:PascalCase, camelCase, hungarian_notation, kebab-case

PascalCase 帕斯卡拼写法( 也叫大骆驼拼写法), 它主要的特点是将描述变量作用所有单词的首字母大写&#xff0c;然后直接连接起来&#xff0c;单词之间没有连接符。 比如&#xff1a;Age, LastName, WinterOfDiscontent camelCase (驼峰命名法&#xff09;驼峰命名法第一个单…

Docker命令起别名

1.打开.bashrc文件 vi ~/.bashrc 2. 起别名 alias dpsdocker ps --format "table{{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}" alias disdocker images 3. 文件生效 source ~/.bashrc 4.展示

Leecode121: 买卖股票的最佳时机1 2 3

第一个思路是从前往后进行遍历&#xff0c;记录一个最小值&#xff0c;然后往后维护一个最大值&#xff0c;不停的减去即可。 买卖股票的最佳时机2&#xff1a; prices [7,1,2,5,6,4] 在第二天买入&#xff0c;在第五天卖出&#xff0c;和不断买入卖出是一样的&#xff0c;所…

量化交易全流程(五)

本节目录 策略回测 多因子模型 本节主要讨论回测相关的内容&#xff0c;包括两种不同的回测机制&#xff0c;即向量化回测和事件驱动回测&#xff1b;如何灵活使用开源工具来编写自己的回测程序&#xff1b;不同实现方式的优劣对比等。 在我们研究策略的时候&#xff0c;需要…

如何用画图将另一个图片中的成分复制粘贴?

一、画图是什么&#xff1f; 画图是Windows自带的一个附件&#xff0c;可于菜单中的Windows附件文件夹中找到&#xff08;自带的为2D画图&#xff0c;有需要的可以下载3D画图&#xff09;&#xff0c;可以用来编辑或查看图片&#xff0c;也可以用来绘制图片&#xff0c;并将图…

海外媒体发稿:商务视频推广销售利器之完全指南

在当今数字化时代&#xff0c;商务视频推广已经成为了企业获取市场份额和提升销售业绩的重要手段。视频作为一种视听媒体&#xff0c;拥有更强大的感染力和传达信息的能力&#xff0c;因此在各种销售场景中得到了广泛应用。本文为大家提供了一份完全指南&#xff0c;帮助你了解…