今天还是力扣1.283. 移动零 - 力扣LeetCode双指针一个指向排好的末尾一个指向未排的开头从头扫描扫到数字两个指针的内容交换class Solution { public: void moveZeroes(vectorint nums) { int n nums.size(); int left 0,right 0; while(right n){ if(nums[right]){ swap(nums[left],nums[right]); left; } right; } } };2.11. 盛最多水的容器 - 力扣LeetCode在做这道题目的时候因为我知道今天做的都是双指针的题目啊所以会下意识的用双指针去做。。。。11. 盛最多水的容器 - 力扣LeetCode这个大佬的题解详细解释了这道题如何使用缩减搜索空间的思想非常牛掰class Solution { public: int maxArea(vectorint height) { int left 0,right height.size()-1; int res 0; while(left right){ int temp min(height[left],height[right])*(right-left); res max(res,temp); if(height[right] height[left]) right--; else left; } return res; } };3.15. 三数之和 - 力扣LeetCode注意代码中对于去重的处理class Solution { public: vectorvectorint threeSum(vectorint nums) { vectorvectorint ans; sort(nums.begin(),nums.end()); int n nums.size(); for(int i 0;i n-2;i){ if(i 0 nums[i] nums[i-1]) continue; int l i1,r n-1; while(l r){ int sum nums[i] nums[l] nums[r]; if(sum 0) l; else if(sum 0) r--; else{ ans.push_back({nums[i],nums[l],nums[r]}); //跳过左右侧重复的元素 while(l r nums[l] nums[l1]) l; while(l r nums[r] nums[r-1]) r--; l; r--; } } } return ans; } };4.42. 接雨水 - 力扣LeetCode开始是想一列一列的计算然后超时了开始我是一边遍历又找着两边的最高点时间复杂度是On^2,然后我就去拷打gpt去了他给出的解决方案是预处理了多开了俩数组记录这一列左边的最高点和右边的最高点。class Solution { public: int trap(vectorint height) { int n height.size(); if (n 3) return 0; vectorint leftMax(n); vectorint rightMax(n); leftMax[0] height[0]; for (int i 1; i n; i) { leftMax[i] max(leftMax[i - 1], height[i]); } rightMax[n - 1] height[n - 1]; for (int i n - 2; i 0; i--) { rightMax[i] max(rightMax[i 1], height[i]); } int sum 0; for (int i 0; i n; i) { int h min(leftMax[i], rightMax[i]) - height[i]; sum h; } return sum; } };