LeetCode Hot100 (双指针)
283. 移动零
标记指针,当前位置为0向后面移动即可
class Solution {public void moveZeroes(int[] nums) {int l = 0;for(int i=0;i<nums.length;i++){if(nums[i]==0){if(l<i){l=i+1;}while(l<nums.length&&nums[l]==0) l++;if(l<nums.length){nums[i]=nums[l];nums[l]=0;l++;}}}String s=nums.toString();System.out.println(s);}
}
11.成最多水的容器
一个比较简单的做法,我们可以直接从高进行枚举,看看水会淹没到哪个位置,双指针左右移动即可
class Solution {public int maxArea(int[] height) {int maxx=0;for(int i=0;i<height.length;i++){maxx=Math.max(height[i],maxx);}int l=0;int ans=0;int r=height.length-1;int n=r-1;for(int i=1;i<=maxx;i++){while(l<=n&&height[l]<i){l++;}while(r>=0&&height[r]<i){r--;}if(r<=l){break;}ans=Math.max((r-l)*i,ans);}return ans;}
}
15.三数之和
我们注意到数字不能有重复的,我们对数组进行排序之后,固定最左边位置的数字,然后枚举右边的两个数字即可,为了降低时间复杂度,双指针维护
class Solution {public List<List<Integer>> threeSum(int[] nums) {List< List<Integer> >res = new ArrayList<>();Arrays.sort(nums);
// System.out.println(Arrays.toString(nums));for(int i = 0; i < nums.length ; i++){if(i>0){if(nums[i]==nums[i-1]){continue;}}if(nums[i]>0){continue;}int l=i+1;int r=nums.length-1;while(l<r){while(l<=r&&nums[l]+nums[r]+nums[i]<0){l++;}while(l<r&&nums[l]+nums[r]+nums[i]>0){r--;}if(l>=r){break;}if(nums[i]+nums[l]+nums[r]==0){List<Integer>arr=List.of(nums[i],nums[l],nums[r]);res.add(arr);}l++;while(l<nums.length&&nums[l]==nums[l-1]){l++;}}}return res;}
}
42. 接雨水
最简单的困难题
实际上每一个点看看前面的最大值和后面的最大值,也就是那两个可以把他包围起来,然后两个最大值取个较小值就ok了
class Solution {public int trap(int[] height) {if(height.length==0){return 0;}int []maxx1=new int[height.length+3];int []maxx2=new int[height.length+3];maxx1[0]=height[0];for(int i=1;i<height.length;i++){maxx1[i]=Math.max(maxx1[i-1],height[i]);}for(int i=height.length - 1;i>=0;i--){maxx2[i]=Math.max(maxx2[i+1],height[i]);}int ans=0;for(int i=1;i<height.length - 1;i++){int f=ans;ans=ans+Math.max(0,Math.min(maxx1[i-1],maxx2[i+1])-height[i]);}return ans;}
}