双指针
283. 移动零
java
class Solution {
public void moveZeroes(int[] nums) {
for(int i = 0, j = 0; i < nums.length; i++){
if(nums[i] != 0){
int temp = nums[i];
nums[i] = 0; // 直接刷为0
nums[j++] = temp;
}
}
}
}11. 盛最多水的容器
java
class Solution {
public int maxArea(int[] height) {
int ans = 0;
int left = 0, right = height.length - 1, minH;
while (left < right) {
minH = Math.min(height[left], height[right]);
ans = Math.max(ans, minH * (right - left));
// 两边高度不一致,短边进入while循环
// 连边高度一致时,都要进入while循环
while (left < right && height[left] <= minH) {
left++;
}
while (left < right && height[right] <= minH) {
right--;
}
}
return ans;
}
}15. 三数之和
java
// 题目要求去重,因此排序比较好
// 参考灵神
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
int n = nums.length;
List<List<Integer>> ans = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < n - 2; i++) {
if (nums[i] + nums[i + 1] + nums[i + 2] > 0) {
break; // 最小和大于0,这里是break结束循环
}
if (nums[i] + nums[n - 1] + nums[n - 2] < 0) {
continue; // 最大和小于0,这里是当前i不满足条件,循环继续
}
if (i > 0 && nums[i] == nums[i - 1]) {
continue; // 去重
}
int j = i + 1, k = n - 1;
while (j < k) {
int sum = nums[i] + nums[j] + nums[k];
if (sum < 0) {
j++;
} else if (sum > 0) {
k--;
} else {
ans.add(List.of(nums[i], nums[j], nums[k]));
for (j++; j < k && nums[j] == nums[j - 1]; j++) {
}
for (k--; j < k && nums[k] == nums[k + 1]; k--) {
}
}
}
}
return ans;
}
}