6.跳跃游戏,移动零,.盛最多水的容器
1.跳跃游戏
public boolean canJump(int[] A) {
int max = 0;
for (int i = 0; i < A.length; i++){
// 不满足当前位置所需要的步数
if (i > max) {
return false;
}
// 可以到达的最大位置下标
max = Math.max(A[i] + i,max);
}
return true;
}
public boolean canJump(int[] A) {
// 逆序贪心
int k = A.length - 1;
for (int i = A.length - 1;i >= 0 ;i--) {
// 可以到达的下一位置
if (A[i] + i >= k) {
k = i;
}
}
return k == 0;
}
2.移动零
public void moveZeroes(int[] A) {
int end = 0;
for (int i = 0;i < A.length;i++){
if (A[i] != 0) {
A[end++] = A[i];
}
}
while (end < A.length) {
A[end++] = 0;
}
}
public void moveZeroes(int[] A) {
int j = 0;
for (int i = 0;i < A.length; i++) {
if (A[i] != 0) {
// j 代表着非零元素的位置
A[j] = A[i];
if (i != j) {
A[i] = 0;
}
j++;
}
}
}
3.盛最多水的容器
public int maxArea(int[] a) {
// 暴力破解
int max = 0;
for (int i = 0; i< a.length - 1; i++) {
for (int j = i + 1; j < a.length; j++) {
int area = (j - i) * Math.min(a[i],a[j]);
max = Math.max(max, area);
}
}
return max;
}
public int maxArea(int[] a) {
// 中间夹逼
int max = 0;
for (int i = 0, j = a.length - 1; i<j;){
// 左右两边,最小的向中间挪动
int minHeight = a[i] < a[j] ? a[i++] : a[j--];
// +1 是因为无论左边还是右边,总有一个会向中间挪动
max = Math.max((j - i + 1) * minHeight , max);
}
return max;
}
2021.12.06 09:01

浙公网安备 33010602011771号