2021-08-01算法题

166 阅读1分钟
  1. 矩阵中战斗力最弱的k行

image.png 思路:使用二维数组存储每一行的军人个数以及对应的索引。然后对二维数组进行排序即可

class Solution {
    public int[] kWeakestRows(int[][] mat, int k) {
        int m = mat.length, n = mat[0].length;
        int a[][] = new int[m][2];
        for (int i = 0; i < m; i++) {
            a[i][0] = i;
            for (int j = 0; j < n; j++) {
                if (mat[i][j] == 0) {
                    break;
                }
                a[i][1]++;
            }
        }
        Arrays.sort(a, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if (o1[1] == o2[1]) {
                    return o1[0] - o2[0];
                } else {
                    return o1[1] - o2[1];
                }
            }
        });
        int result[] = new int[k];
        for (int i = 0; i < k; i++) {
            result[i] = a[i][0];
        }
        return result;
    }
}
  1. 找到所有数组中消失的数字

image.png 思路:创建一个数组a,然后遍历nums,将其对应的值nums[i]当作a的索引,然后a[nums[i]]++。最后遍历a数组,如果为0则说明该数字未出现

class Solution {
    public List<Integer> findDisappearedNumbers(int[] nums) {
        List<Integer> l = new ArrayList<>();
        int a[] = new int[nums.length + 1];
        for (int i = 0; i < nums.length; i++) {
            a[nums[i]]++;
        }
        for (int i = 1; i <= nums.length; i++) {
            if (a[i] == 0) {
                l.add(i);
            }
        }
        return l;
    }
}
  1. 最小操作次数使数组元素相等

image.png 思路:暴力解法,每次找出最大的值的索引,其余的加一,当全部元素都一样时return,但会超时。

class Solution {
    public int minMoves(int[] nums) {
        int count = 0;
        while (judge(nums)) {
            int index = getMax(nums);
            for (int i = 0; i < nums.length; i++) {
                if (i != index) {
                    nums[i]++;
                }
            }
            count++;
        }
        return count;
    }

    public int getMax(int[] n) {
        int index = -1;
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < n.length; i++) {
            if (n[i] > max) {
                max = n[i];
                index = i;
            }
        }
        return index;
    }

    public boolean judge(int[] n) {
        for (int i = 1; i < n.length; i++) {
            if (n[i] != n[i - 1]) {
                return true;
            }
        }
        return false;
    }
}