leetcode周赛196(Java)

每次的周赛的目标就是做出前三题。

1.判断能否形成等差数列

给你一个数字数组 arr 。
如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。

如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false

  很简单的题目,等差数列的特征即:相邻两数的差相等。该题思路为:先对该数组排序,然后计算每个数和前一个数的差,判断这些差是否时同一个值。代码如下:

class Solution {
    public boolean canMakeArithmeticProgression(int[] arr) {
        Arrays.sort(arr);
        int d = arr[1] - arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] - arr[i-1] != d)
                return false;
        }
        return true;
    }
}

2、所有蚂蚁掉下来前的最后一刻

有一块木板,长度为 n 个 单位 。一些蚂蚁在木板上移动,每只蚂蚁都以 每秒一个单位 的速度移动。其中,一部分蚂蚁向 左 移动,其他蚂蚁向 右 移动。

当两只向 不同 方向移动的蚂蚁在某个点相遇时,它们会同时改变移动方向并继续移动。假设更改方向不会花费任何额外时间。

而当蚂蚁在某一时刻 t 到达木板的一端时,它立即从木板上掉下来。

给你一个整数 n 和两个整数数组 left 以及 right 。两个数组分别标识向左或者向右移动的蚂蚁在 t = 0 时的位置。请你返回最后一只蚂蚁从木板上掉下来的时刻。

  这种题目考虑清楚题目就可以了。如果不考虑蚂蚁相遇的情况,即蚂蚁相遇后仍不变向。此时只用找到 left 数组中的最大值和 right数组中的最大值,比较 maxLeft 和 n - minRigh即可。
  考虑相遇变向的情况,如果是left = [3], right = [5] 经过一秒后,两者都走到 4 ,双方相遇都变向,数组变为了 left = [4] right = [4];如果left = [4],right = [5] ,一秒后右边的蚂蚁位置不变,方向改变,左边的蚂蚁也是位置不变,方向改变,数组变为:left = [5], right = [4]。经过观察后可以发现,相遇是否转向不影响left,right数组的变化,即每一秒过后,所有left数组减一,right数组加一。

class Solution {
    public int getLastMoment(int n, int[] left, int[] right) {
        
        int maxLeft = 0;
        int minRight = n;
        for (int i = 0; i < left.length; i++) {
            if (maxLeft < left[i])
                maxLeft = left[i];
        }
        for (int i = 0; i < right.length; i++) {
            if (minRight > right[i])
                minRight = right[i];
        }
        return Math.max(maxLeft, n - minRight);
    }
}

3、统计全 1 子矩形

给你一个只包含 0 和 1 的 rows * columns 矩阵 mat ,请你返回有多少个 子矩形 的元素全部都是 1 。
   我暂时没想到简便的方法,只有暴力搜索了。分别确定一个矩形的坐上点和右下点,遍历该矩形判断是否为全1矩形。注意及时break,就不会超时。

class Solution {
    public int numSubmat(int[][] mat) {
        int ans = 0;
        int m = mat.length;
        int n = mat[0].length;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                
                for (int k = i; k < m; k++) {
                    int l = 0;
                    for (l = j; l < n; l++) {
                        int row = 0;
                        for ( row = i; row <= k; row++) {
                            int col = 0;
                            for (col = j; col <= l; col++) {
                                if (mat[row][col] != 1)
                                    break;
                            }
                            if (col <= l) break;
                        }
                        if (row > k) ans++;
                        else break;       
                    }
                }
            }
        }
        
        return ans;
    }
}

你可能感兴趣的:(LeetCode)