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

优选算法第一讲:双指针模块

优选算法第一讲:双指针模块

  • 1.移动零
  • 2.复写零
  • 3.快乐数
  • 4.盛最多水的容器
  • 5.有效三角形的个数
  • 6.查找总价格为目标值的两个商品
  • 7.三数之和
  • 8.四数之和

1.移动零

链接: 移动零
下面是一个画图,其中,绿色部分标出的是重点:
在这里插入图片描述
代码实现:

class Solution {
public:void moveZeroes(vector<int>& nums) {//定义双指针for(int cur = 0, des = -1; cur < nums.size(); cur++){//当cur指向的位置不为0时,才进行交换if(nums[cur]){swap(nums[cur], nums[++des]);//注意:先++des,再进行交换}}}
};

2.复写零

链接: 复写零
在这里插入图片描述
代码实现:

class Solution {
public:void duplicateZeros(vector<int>& arr) {//先找到src的位置int src = 0, des = -1, n = arr.size();while(src < n){if(arr[src]) des++;else des+=2;if(des >= n-1) break;src++;}if(des == n){//发生了越界时,修正des的位置arr[n-1] = 0;src--;des -= 2;}//从后向前复写while(des > 0){if(arr[src])arr[des--] = arr[src--];else{arr[des--] = 0;arr[des--] = 0;src--;}}}
};

3.快乐数

链接: 快乐数
在这里插入图片描述

class Solution {
public://按照题意求值int Value(int n){//循环*10 %10,C语言中讲过int sum = 0;while(n){int t = n % 10;sum += t*t;n = n /10;}return sum;}bool isHappy(int n) {int slow = n, fast = Value(n);while(slow != fast){slow = Value(slow);fast = Value(Value(fast));}return slow == 1;}
};

4.盛最多水的容器

链接: 盛最多水的容器
在这里插入图片描述
代码实现:

class Solution {
public:int maxArea(vector<int>& height) {int left = 0, right = height.size()-1, ret = 0;while(left < right){int H = min(height[left], height[right]);ret = max(ret, (right-left)*H);if(height[left] > height[right]) right--;else left++;}return ret;}
};

5.有效三角形的个数

链接: 有效三角形的个数
在这里插入图片描述

class Solution {
public:int triangleNumber(vector<int>& nums) {//1.先对数组进行排序sort(nums.begin(), nums.end());int sum = 0;for(int i = nums.size()-1; i>=2; i--){//i为最大值的下标//使用双指针进行运算int left = 0, right = i-1;while(left < right){if(nums[left] + nums[right] > nums[i]){sum += right-left;right--;}else left++;}}return sum;}
};

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

链接: 查找总价格为目标值的两个商品
在这里插入图片描述

class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {//因为题目说明已经是升序了,所以我们不用再进行排序了//使用双指针算法int left = 0, right = price.size()-1;while(left < right){if(price[left] + price[right] > target) right--;else if(price[left] + price[right] < target) left++;else return {price[left], price[right]};}return {0, 0};}
};

7.三数之和

在这里插入图片描述

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ret;//1.先对数组进行排序sort(nums.begin(), nums.end());//对i的固定int i = 0;while(i <= nums.size()-3){//双指针算法int left = i+1, right = nums.size()-1;while(left < right){if(nums[left] + nums[right] > -nums[i]) right--;else if(nums[left] + nums[right] < -nums[i]) left++;else{//当相等时,先插入数据ret.push_back(vector<int>({nums[left], nums[right], nums[i]}));//再处理去重问题left++;right--;while(left < right && nums[left] == nums[left-1]) left++;while(left < right && nums[right] == nums[right+1]) right--;}}//对i进行去重i++;while(i <= nums.size()-3 && nums[i] == nums[i-1]) i++;}return ret;}
};

8.四数之和

链接: 四数之和
在这里插入图片描述

http://www.lryc.cn/news/460350.html

相关文章:

  • 智能优化算法-水循环优化算法(WCA)(附源码)
  • 基于SpringBoot的个性化健康建议平台
  • Mapsui绘制WKT的示例
  • Modbus TCP 西门子PLC指令以太口地址配置以及 Poll Slave调试软件地址配置
  • MySQL表的基本查询上
  • MySQL中什么情况下类型转换会导致索引失效
  • 数据治理的意义
  • 快手游戏服务端C++开发一面-面经总结
  • git的学习使用(认识工作区,暂存区,版本区。添加文件的方法)
  • Series数据去重
  • Python语言核心12个必知语法细节
  • 解决ImageIO无法读取部分JPEG格式图片问题
  • 使用three.js 实现蜡烛效果
  • 手动在Linux服务器上部署并运行SpringBoot项目(新手向)
  • 自媒体短视频如何制作?
  • 2024年河南省职业技能竞赛(网络建设与运维赛项)
  • git--git reset
  • Spring Boot的实用内置功能详解
  • 撸猫变梳毛?怎么解决猫咪掉毛问题?好用的宠物空气净化器推荐
  • 人声分离免费软件,六款好用软件处理音乐更轻松!
  • 数据分析Power BI设置万为单位的数据
  • (AI 生成) 新时代游击方式: 利用 “灵活就业“ 红利
  • Unity UndoRedo(撤销重做)功能
  • 28条有关人工智能的名言
  • 搞机器视觉项目看不起搞机器视觉培训的,实际上怎么样
  • 使用Jenkins部署项目
  • 【机器学习与神经网络荣获诺贝尔奖】科学边界的扩展及技术革新
  • Javascript扩展符号(...)使用说明
  • giugughk
  • 【微服务】网关 - Gateway(下)(day8)