第一题:1341. 方阵中战斗力最弱的 K 行
解题思路:遍历一遍二维数组,将每一行的值统计出来,并进行排列。把前k个放到答案数组中即可。
代码:
import javafx.util.Pair;
class Solution {
public int[] kWeakestRows(int[][] mat, int k) {
List<Pair<Integer,Integer>> ans = new ArrayList<>();
int n = mat.length;
for (int i = 0; i < n; i++) {
int flag = 0;
for (int j = 0; j < mat[i].length; j++) {
flag+=mat[i][j];
}
ans.add(new Pair<>(i,flag));
}
Collections.sort(ans, new Comparator<Pair<Integer, Integer>>() {
@Override
public int compare(Pair<Integer, Integer> o1, Pair<Integer, Integer> o2) {
return o1.getValue()-o2.getValue();
}
});
int[] ret = new int[k];
for (int i = 0; i < k; i++) {
ret[i] = ans.get(i).getKey();
}
return ret;
}
}
第二题:1342. 数组大小减半
解题思路:利用一个map存储数组中每个数字出现的次数,然后对这个map按值排序,最后统计一下需要多少个能超过一半即可。
代码:
class Solution {
public int minSetSize(int[] arr) {
Map<Integer,Integer> hashMap = new HashMap<>();
for (int i = 0; i < arr.length; i++) {
if (hashMap.containsKey(arr[i])){
hashMap.put(arr[i],hashMap.get(arr[i])+1);
}else {
hashMap.put(arr[i],1);
}
}
Map<Integer, Integer> map = sortByValue2(hashMap);
Set set = map.keySet();
int n = arr.length/2;
int ans = 0;
int count = 0;
for (Integer integer : set) {
count+=map.get(integer);
ans++;
if (count==n){
return set.size()-ans;
}
if(count>n) return set.size()-ans+1;
}
return ans;
}
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue2(Map<K, V> map) {
LinkedHashMap<K,V> result =new LinkedHashMap<>();
map.entrySet().stream().sorted(Map.Entry.comparingByValue()).forEachOrdered(x->result.put(x.getKey(),x.getValue()));
return result;
}
}
第三题:1343. 分裂二叉树的最大乘积
解题思路:题意就是在树中删除一条边,使得原树变成两部分,需要使得这两部分树的和的乘积最大。其实我们无论删除哪一条边,都能得到一个完整的树+该树的其他部分。我们可以先遍历一遍树,统计一下这颗树节点总和,然后利用dfs穷举一下这颗树的完整部分,相乘即可。
代码:
class Solution {
double ans5330 = 0;
public int maxProduct(TreeNode root) {
int sum = dfs5330(root);
System.out.println(sum);
dfs53302(root,sum);
return (int)(ans5330%(1e9+7));
}
public int dfs53302(TreeNode root,int sum){
if (root==null) return 0;
int temp = root.val;
temp += dfs53302(root.left,sum);
temp += dfs53302(root.right,sum);
ans5330 = Math.max(temp*1.0*(sum-temp),ans5330);
return temp;
}
public int dfs5330(TreeNode root){
if (root==null)return 0;
return root.val+dfs5330(root.left)+dfs5330(root.right);
}
}