- 矩阵中战斗力最弱的k行
思路:使用二维数组存储每一行的军人个数以及对应的索引。然后对二维数组进行排序即可
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;
}
}
- 找到所有数组中消失的数字
思路:创建一个数组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;
}
}
- 最小操作次数使数组元素相等
思路:暴力解法,每次找出最大的值的索引,其余的加一,当全部元素都一样时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;
}
}