Leetcode174周赛

第一题: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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值