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

算法之双指针系列1

目录

一:双指针的介绍

1:快慢指针

2:对撞指针

二:对撞指针例题讲述


一:双指针的介绍

在做题中常用两种指针,分别为对撞指针与快慢指针。

1:快慢指针

简称为龟兔赛跑算法,它的基本思想是使用两个移动速度不同的指针在数组或链表等序列结构上移动。

这种对于处理环形链表和数组以及循环重复问题,是非常好用的。

2:对撞指针

简称为左右指针,它的基本思想是一个指针从最左端开始,一个从最右端开始,逐渐往中间逼近。一般终止条件是两个指针相遇或者错开。

一般用于顺序结构中。

注意:这里的指针并不是C语言中的指针,而是指在数组中设置的两个下标,通过改变两个下标来改变所在数组的位置。

二:对撞指针例题讲述

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

1:盛最多水容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

算法原理:

解法1:暴力枚举,是很简单的,但是我们可以发现他的时间复杂度是超时的。

解法2:双指针法,题中让求v,那么v=h*w.

186254837

就以上面的数组举例。

我们设左指针left为数组最左边的下标,右指针right为数组最右边的下标。

那么我们要取最大的V只有一种情况,就要h变大,w变小。(因为最开始的W最大)。

int n=height.size();
int left=0,right=n-1;设置左右指针。
int ret=0;
while(left<right)
{
    int sum=min(height[left],height[right])*(right-left) //求v
     ret=max(ret,sum)//求出最大的v.
    if(height[left]<height[right])
    left++;
    else
    right--;
    
}
return ret;

 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

2:有效三角形的个数

给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。

示例 1:

输入: nums = [2,2,3,4]
输出: 3
解释:有效的组合是: 
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3

需要的判断条件就是两个最小边之和大于最大边。

算法原理:

第一种:暴力求解。明显的是超出时间限制的。

第二种:双指针 。利用单调性。

1.先固定最大的数。

2.在最大的数的左区域内,使用双指针算法,快速统计出符合要求的三元组的个数。

sort(nums.begin(),nums.end());//这一步是排序。
int n=nums.size();
int i=n-1;
int ret=0;
     for(i;i>=2;i--)
   {
     int left=0;
     int right=i-1;
       while(left<right)//基本条件
       { 
         
         if(nums[left]+nums[right]<=nums[i]) left++;
         else  
         {
           ret+=right-left;
           right--;
          }
       }
    
 }
return ret;

}

 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。

示例 1:

输入:price = [3, 9, 12, 15], target = 18
输出:[3,15] 或者 [15,3]

算法思路

1:暴力枚举。显然还是超过时间限制。

2:双指针。比较简单就不再详解。

 int left = 0, right = nums.size() - 1;
 while(left < right)
 {
 int sum = nums[left] + nums[right];
 if(sum > target) right--;
 else if(sum < target) left++;
 else return {nums[left], nums[right]};
 }
 // 照顾编译器
 return {-4941, -1};

 


http://www.kler.cn/a/233679.html

相关文章:

  • redis7.x源码分析:(1) sds动态字符串
  • 深度学习——优化算法、激活函数、归一化、正则化
  • vue2.7.14 + vant + vue cli脚手架转vite启动运行问题记录
  • 鸿蒙next版开发:ArkTS组件点击事件详解
  • Spring Boot 1.x 版本可以集成 Spring Cloud Sleuth
  • 「Py」Python基础篇 之 Python都可以做哪些自动化?
  • [python-opencv] PNG 裁切物体
  • 【春节特辑】回顾与展望:运维软件领域的2023与2024
  • 计算机网络-差错控制(奇偶校验码 CRC循环冗余码)
  • SpringCloud-搭建Nacos服务中心
  • 【前端高频面试题--Vue生命周期篇】
  • K8S之运用亲和性设置Pod的调度约束
  • docker实际生产中遇到的问题及解决办法
  • 前端配置了axios.defaults.withCredentials = true,但出现了跨域问题
  • 数据结构——5.5 树与二叉树的应用
  • 【错误文档】This与Here的区别、主系表结构、如何合并两个句子、祈使句结构
  • linux 07 存储管理
  • kali最新最简单安装
  • 社区店选址要素揭秘:人流量与商业潜力的关键
  • 十大排序算法之线性时间非比较类排序
  • 电商小程序05用户注册
  • 吉他学习:C大调第一把位音阶,四四拍曲目练习 小星星,练习的目的
  • Mac OS 取消隔离扩展属性
  • HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-时间管理
  • #vu3# element plus表格的序号字段
  • STM32CubeMX,定时器之定时功能,入门学习,如何设置prescaler,以及timer计算PWM输入捕获方法(重要)