双指针
- 移动零
- 11. 盛最多水的容器
移动零
思路:
双指针i,j,j指针遍历数组,i指针存放非0元素。遍历结束后,i指针及其后面的一定是0,就再将空出来的位置设置为0
移动零
class Solution {
public void moveZeroes(int[] nums) {
if(nums == null || nums.length == 0){
return;
}
int n = nums.length;
int i = 0, j = 0;
while(j < n){
if(nums[j] != 0){
nums[i] = nums[j];
i ++; // 大于0的个数
}
j ++;
}
while(i < n){
nums[i ++] = 0;
}
}
}
11. 盛最多水的容器
11. 盛最多水的容器
思路
宽度w 乘以 两个柱子中最短的柱子h,此时我们若移动比较高的柱子,结果只有两种:1.新柱子比最短的柱子h 高,此时无论这个柱子再高,高度都只能取较小的短板柱子,即高度是h。所以不仅宽度w减少了,高度h还没变,结果肯定变小,这是不符合的. 2.比最短的柱子h 矮了,此时h变得更小了,w也减小,就更不可能了。
综上,只有移动短的柱子才有可能比原来的结果大,因为虽然宽度w在减小,但可能h变大,w*h整体才有可能变大。h变小的话可能整体变小,但不影响,因为我们已经记录下了最大值了
class Solution {
public int maxArea(int[] height) {
/*
*/
int n = height.length;
int i = 0, j = n - 1;
int ans = 0;
while(i < j){
ans = Math.max(ans, Math.min(height[j], height[i]) *(j - i));
// 移动较小的柱子
if(height[i] < height[j]){ // 除掉左边柱子
i ++;
}else{
j --;
}
}
return ans;
}
}