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.盛最多水的容器

https://leetcode-cn.com/problems/container-with-most-water/

  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

posted @ 2021-12-06 09:09  哟喝  阅读(36)  评论(0)    收藏  举报