前言
欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
今天是新的开始 双指针 🔥
一、练习题目
二、算法思路
- 1、11. 盛最多水的容器:🔥经典双指针。
- 2、1346. 检查整数及其两倍数是否存在:🔥🔥稍微有点绕,由于数组可能出现负数的情况,需要分类讨论。
三、源码剖析
// 11. 盛最多水的容器
class Solution {
public:
int maxArea(vector<int>& height) {
int l = 0, r = height.size() - 1; //(1)
int ans = 0;
while (l < r)
{
int tmp = min(height[l], height[r]) * (r - l); //(2)
ans = max(ans, tmp);
if(height[l] <= height[r]) { //(3)
++l;
} else
--r;
}
return ans;
}
};
- 1、初始化双指针;
- 2、这里求的就是能盛多少水,高度是由于最短的那个木板决定,乘上长度(即下标相减)所得就是能盛水的面积;
- 3、左边的板短,则左指针右移,找长板;反之右指针左移。
// 1346 检查整数及其两倍数是否存在
class Solution {
public:
bool checkIfExist(vector<int>& arr) {
sort(arr.begin(), arr.end());
for (auto i = arr.begin(), j = arr.begin(); i != arr.end(); ++i) {
while (j != arr.end() && *i * 2 > *j)
++j;
if (j != arr.end() && i != j && *i * 2 == *j)
return true;
}
return false;
}
};
- 1、i指针去遍历x,j指针去遍历2x即可。