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

【优选算法】C++双指针问题

一、移动零

双指针,一个cur,一个dest

两个指针的作用:

cur:从左往右扫描数组,遍历数组

dest:已处理的区间内,非零元素的最后一个位置

三个区间:[ 0, dest ] [ dest + 1, cur - 1 ] [ cur, n - 1 ]

class Solution {
public:void moveZeroes(vector<int>& nums) {int cur = 0, dest = 0;int n = nums.size();while(cur < n){if(nums[cur] != 0)swap(nums[dest++], nums[cur]);cur++;}}
};

2、复写零

思路: 

class Solution {
public:void duplicateZeros(vector<int>& arr) {int dest = -1, cur = 0, n = arr.size();// 从左往右while(cur < n){if(arr[cur]) dest++;else dest+=2;if(dest >= n-1) break;cur++;}// 处理边界情况if(dest == n){arr[n-1] = 0;cur--;dest-=2;}// 从右往左while(cur >= 0){if(arr[cur])    {arr[dest--] = arr[cur--];}else{cur--;arr[dest--] = 0;arr[dest--] = 0;}}}
};

3、快乐数

思路: 

class Solution {
public:int _isHappy(int n) {int ret = 0;while (n) {int m = n % 10;ret += pow(m, 2);n /= 10;}return ret;}bool isHappy(int n) {int low = n, fast = n;low = _isHappy(low);fast = _isHappy(fast);fast = _isHappy(fast);while (fast != low) {low = _isHappy(low);fast = _isHappy(fast);fast = _isHappy(fast);}if (fast == 1)return true;elsereturn false;}
};

4、盛水最多的容器

思路: 

 

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

5、有效三角形的个数

思路: 

 

class Solution {
public:int triangleNumber(vector<int>& nums) {// 先排序sort(nums.begin(), nums.end());// 排序完成int n = nums.size(), c = n - 1;int sum = 0;while (c >= 2) {int left = 0, right = c - 1;while (left < right) {if (nums[left] + nums[right] > nums[c]) {sum += (right - left);right--;} elseleft++;}c--;}return sum;}
};

6、和为s的两个数

思路: 

 

class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {int left = 0, right = price.size()-1;vector<int> retv;while(left < right){if(price[left] + price[right] > target) right--;else if(price[left] + price[right] < target) left++;else {retv.push_back(price[left]);retv.push_back(price[right]);break;}}return retv;}
};

7、三数之和

思路:  

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> vv;// 1.先排序sort(nums.begin(), nums.end());// 2.固定一个数int i = 0, n = nums.size();while (i < n-1) {int left = i + 1, right = n - 1;int val = -nums[i];while (left < right) {if (nums[left] + nums[right] > val)right--;else if (nums[left] + nums[right] < val)left++;else {vector<int> v;v.push_back(nums[left]);v.push_back(nums[right]);v.push_back(-val);while (nums[left] == nums[++left] && left < right);         // 去重while (nums[right] == nums[--right] && left < right);       // 去重vv.push_back(v);}}while(nums[i] == nums[++i] && i < n-1);     // 去重,i < n-1,避免越界}return vv;}
};

8、四数之和

思路:  

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> vv;// 1.排序sort(nums.begin(), nums.end());// 排序完成,开始操作int n = nums.size();for(int i = 0; i < n; ){// 固定bfor(int j = i+1; j < n;){long long arm = (long long)target - nums[i] - nums[j];int left = j+1, right = n-1;while(left < right){int sum = nums[left] + nums[right];if(sum < arm) left++;else if(sum > arm) right--;else{vv.push_back({nums[i], nums[j], nums[left], nums[right]});// 开始去重 left rightleft++;while(left < right && nums[left] == nums[left-1]) left++;right--;while(left < right && nums[right] == nums[right+1]) right--;}}// 去重 jj++;while(j < n && nums[j] == nums[j-1]) j++;}// 去重 ii++;while(i < n && nums[i] == nums[i-1]) i++;}return vv;}
};// 第二种变形
class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> vv;// 1.排序sort(nums.begin(), nums.end());// 排序完成,开始操作// 固定aint a = 0, n = nums.size();while (a < n - 1) {// 固定bint b = a + 1;while (b < n - 1) {int left = b + 1, right = n - 1;long long val = (long long)target - nums[a] - nums[b];while (left < right) {if (nums[left] + nums[right] > val)right--;else if (nums[left] + nums[right] < val)left++;else {vv.push_back({nums[a], nums[b], nums[left], nums[right]});// 去重 left rightwhile (nums[left] == nums[++left] && left < right);while (nums[right] == nums[--right] && left < right);}}// 去重 bwhile (nums[b] == nums[++b] && b < n - 1);}// 去重 awhile (nums[a] == nums[++a] && a < n - 1);}return vv;}
};

相关文章:

  • 基于扩展卡尔曼滤波(EKF)目标轨迹算法仿真实例
  • 《深挖Java中的对象生命周期与垃圾回收机制》
  • PECVD 和 半导体等离子体刻蚀 工艺的异同点
  • 【Pandas】pandas DataFrame all
  • Java中关于多态的总结
  • 【Python-Day 11】列表入门:Python 中最灵活的数据容器 (创建、索引、切片)
  • 已解决:安卓刚打开新项目的时候,会下载该项目要求的sdk gradle,开了科学上网也慢
  • 《Spring Boot 3.0全新特性详解与实战案例》
  • 使用 NSSM 安装 Tomcat 11.0.6 为 Windows 服务
  • QT聊天项目DAY10
  • 【Golang】gin框架动态更新路由
  • WebRTC流媒体传输协议RTP点到点传输协议介绍,WebRTC为什么使用RTP协议传输音视频流?
  • 电压取样端口静电浪涌防护方案 之6TS Series瞬态抑制器TVS
  • 2025年社交APP安全防御指南:抵御DDoS与CC攻击的实战策略
  • 【免杀】C2免杀 | 概念篇
  • Python 爬虫基础入门教程(超详细)
  • 2025数字孪生技术全景洞察:从工业革命到智慧城市的跨越式发展
  • 进入虚拟机单用户模式(Linux系统故障排查)
  • Vscode 顶部Menu(菜单)栏消失如何恢复
  • Java——反射
  • 中铁房地产24.7亿元竞得上海松江新城宅地,溢价率20.42%
  • 城管给商户培训英语、政银企合作纾困,上海街镇这样优化营商环境
  • 联想发布超级智能体矩阵,杨元庆:美国关税影响反映在产品定价上,未来不确定性很大
  • 两次蹚入同一条河,巴萨这一晚被命运抛弃
  • 抗战回望20︱《山西省战区抗敌行政工作检讨会议议决案》:“强民政治”、“说服行政”
  • 最新研究:基因编辑治疗晚期胃肠道癌显成效