力扣一百题——双指针题解
移动零
题目
283. 移动零 - 力扣(LeetCode)
思路
类似快速排序的思想,以0为中间点,把不等于0的放在左边,把为0的放在右边
代码
public void moveZeroes(int[] nums) {
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
int t = nums[i];
nums[i] = nums[j];
nums[j++] = t;
}
}
}
盛最多的雨水
题目
11. 盛最多水的容器 - 力扣(LeetCode)
思路
用双指针代表容器的左右边界,将对应的数字较小的那个指针往另一个指针的方向移动一个位置,不断移动,找出最大的面积
代码
public int maxArea(int[] height) {
int l = 0, r = height.length - 1;
int max = 0;
while (l < r) {
int area = Math.min(height[l], height[r]) * (r - l);
max = Math.max(max, area);
if (height[l] > height[r]) {
r--;
} else {
l++;
}
}
return max;
}
三数之和
题目
15. 三数之和 - 力扣(LeetCode)
思路
固定一个数,然后在剩余部分中使用双指针查找两个数,使得三者之和为零
代码
public List<List<Integer>> threeSum(int[] nums) {
int n = nums.length;
Arrays.sort(nums);
List<List<Integer>> integers = new ArrayList<>();
for (int i = 0; i < n; i++) {
if (i != 0 && nums[i] == nums[i - 1]) {
continue;
}
int t = -nums[i];
int third = n - 1;
for (int j = i + 1; j < n; j++) {
if (j > i && nums[j] == nums[j - 1]) {
continue;
}
while (j > third && nums[j] + nums[third] > t) {
third--;
}
if (third == j) {
break;
}
if (nums[j] + nums[third] == t) {
ArrayList<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[third]);
integers.add(list);
}
}
}
return integers;
}
接雨水
题目
42. 接雨水 - 力扣(LeetCode)
思路
用maxL和maxR代表当前下标i左边的最大值和右边的最大值,然后计算总的面积值
代码
public int trap(int[] height) {
int n = height.length,sum=0;
if(n==0)
return 0;
int []maxL = new int[n];
int []maxR = new int[n];
for(int i=0;i<n;i++){
if(i==0){
maxL[i]=height[i];
continue;
}
maxL[i] = Math.max(height[i],maxL[i-1]);
}
for(int i=n-1;i>-1;i--){
if(i==n-1){
maxR[i] = height[i];
continue;
}
maxR[i] = Math.max(maxR[i+1],height[i]);
}
for(int i=0;i<n;i++){
sum=sum+Math.min(maxR[i],maxL[i])-height[i];
}
return sum;
}