力扣 第79场双周赛

力扣 第79场双周赛

6083. 判断一个数的数字计数是否等于数位的值

啪的一下很快呀

class Solution {
	public boolean digitCount(String num) {
		int len = num.length();
		int[] nums = new int[10];
		for(int i = 0; i < num.length(); i++){
			nums[Character.getNumericValue(num.charAt(i))]++;
		}
		for(int i = 0; i < num.length(); i++){
			if(Character.getNumericValue(num.charAt(i)) == nums[i]){
				continue;
			}else {
				return false;
			}
		}
		return true;
		

	}
}

6084.最多单词数的发件人

啪的一下,答案错误,很快呀,修修改改,注意细节,不要紧张

class Solution {
    public String largestWordCount(String[] messages, String[] senders) {
		String res = "";
		int ms = messages.length;
		int sd = senders.length;
		int len = -1;
		HashMap<String, Integer> map = new HashMap<>();
		for(int i = 0; i < sd; i++){
			int cur = messages[i].replaceAll(" ", ",,").length() - messages[i].length() + 1;
			if(!map.containsKey(senders[i])){
				map.put(senders[i], cur);
			}else {
				map.put(senders[i], map.get(senders[i]) + cur);
			}
			if(map.get(senders[i]) > len){
				res = senders[i];
				len = map.get(senders[i]);
			}else if(map.get(senders[i]) == len && res.compareTo(senders[i]) < 0){
				res = senders[i];
				len = cur;
			}
            if(senders[i].equals("FnZd")){
                System.out.println(len + " " + res);
                System.out.println(cur);
            }
		}
		System.out.println(len + " " + res);
		return res;
	}
}

6085. 道路的最大总重要性

啪的一下很快呀,简简单单哈,优先队列,但代码很烂,得学习别人的代码

class Solution {
    class Node{
		int key;
		int val1;
		
		Node(int key, int val1){
			this.key = key;
			this.val1 = val1;
		}

		public int getKey() {
			return key;
		}

		public void setKey(int key) {
			this.key = key;
		}

		public int getVal() {
			return val1;
		}

		public void setVal(int val) {
			this.val1 = val;
		}
	}
	public long maximumImportance(int n, int[][] roads) {
		int[] val = new int[n];
		int[] temp = new int[n];
		long res = 0;
		for (int i = 0; i < roads.length; i++){
			val[roads[i][0]]++;
			val[roads[i][1]]++;
		}
		PriorityQueue<Node> priorityQueue = new PriorityQueue<>(new Comparator<Node>() {
			@Override
			public int compare(Node o1, Node o2) {
				if(o1.val1 > o2.val1){
					return -1;
				}else if(o1.val1 < o2.val1){
					return 1;
				}
				return 0;
			}
		});
		for(int i = 0; i < val.length; i++){
			Node cur = new Node(i, val[i]);
			priorityQueue.add(cur);
		}
		int len = priorityQueue.size();
		for(int i = 0; i < len; i++){
			Node per = priorityQueue.poll();
            System.out.println(per.key + " " + per.val1);
			temp[per.key] = n--; 
		}

		for (int i = 0; i < roads.length; i++){
			res += temp[roads[i][0]] + temp[roads[i][1]];
		}
		return res;

	}
}

别人滴代码,真优美

class Solution {
    public long maximumImportance(int n, int[][] roads) {
        int[] cnts = new int[n]; // 存每个节点的边的个数
        int len = roads.length;
        for (int i = 0; i < len; ++i) {
            cnts[roads[i][0]]++;
            cnts[roads[i][1]]++;
        }
        Arrays.sort(cnts);
        long ans = 0;
        for (int i = 0; i < n; ++i) {
            ans += (i + 1L) * cnts[i]; // 注意1L使得在计算值的过程中转为long计算, 否则可能会溢出int
        }
        return ans;
    }
}

10011. 以组为单位订音乐会的门票

啪的一下,很快啊,答案错误啊,一看结构设计,数据弱,直接模拟以为,没想到啊,是线段树呀

class BookMyShow {
    int n, m;
    int[] min;
    long[] sum;

    public BookMyShow(int n, int m) {
        this.n = n;
        this.m = m;
        min = new int[n * 4];
        sum = new long[n * 4];
    }

    public int[] gather(int k, int maxRow) {
        int i = index(1, 1, n, maxRow + 1, m - k);
        if (i == 0) return new int[]{}; // 不存在
        var seats = (int) query_sum(1, 1, n, i, i);
        add(1, 1, n, i, k); // 占据 k 个座位
        return new int[]{i - 1, seats};
    }

    public boolean scatter(int k, int maxRow) {
        if ((long) (maxRow + 1) * m - query_sum(1, 1, n, 1, maxRow + 1) < k) return false; // 剩余座位不足 k 个
        // 从第一个没有坐满的排开始占座
        for (var i = index(1, 1, n, maxRow + 1, m - 1); ; ++i) {
            var left_seats = m - (int) query_sum(1, 1, n, i, i);
            if (k <= left_seats) { // 剩余人数不够坐后面的排
                add(1, 1, n, i, k);
                return true;
            }
            k -= left_seats;
            add(1, 1, n, i, left_seats);
        }
    }

    // 将 idx 上的元素值增加 val
    void add(int o, int l, int r, int idx, int val) {
        if (l == r) {
            min[o] += val;
            sum[o] += val;
            return;
        }
        var m = (l + r) / 2;
        if (idx <= m) add(o * 2, l, m, idx, val);
        else add(o * 2 + 1, m + 1, r, idx, val);
        min[o] = Math.min(min[o * 2], min[o * 2 + 1]);
        sum[o] = sum[o * 2] + sum[o * 2 + 1];
    }

    // 返回区间 [L,R] 内的元素和
    long query_sum(int o, int l, int r, int L, int R) { // L 和 R 在整个递归过程中均不变,将其大写,视作常量
        if (L <= l && r <= R) return sum[o];
        var sum = 0L;
        var m = (l + r) / 2;
        if (L <= m) sum += query_sum(o * 2, l, m, L, R);
        if (R > m) sum += query_sum(o * 2 + 1, m + 1, r, L, R);
        return sum;
    }

    // 返回区间 [1,R] 中 <= val 的最靠左的位置,不存在时返回 0
    int index(int o, int l, int r, int R, int val) { // R 在整个递归过程中均不变,将其大写,视作常量
        if (min[o] > val) return 0; // 说明整个区间的元素值都大于 val
        if (l == r) return l;
        var m = (l + r) / 2;
        if (min[o * 2] <= val) return index(o * 2, l, m, R, val); // 看看左半部分
        if (m < R) return index(o * 2 + 1, m + 1, r, R, val); // 看看右半部分
        return 0;
    }
}

暴力

class BookMyShow {
    long linehas[];
    long m;
    public BookMyShow(int n, int m) {
        linehas = new long[n];
        this.m = m;
    }
    
    public int[] gather(int k, int maxRow) {
        for(int i = 0; i <= maxRow; i ++){
            if (m - linehas[i] >= k){
                int idx = (int)linehas[i];
                linehas[i] += k;
                return new int[] {i, idx};
            }
        }
        return new int[]{};
    }
    
    public boolean scatter(int k, int maxRow) {
        long allhas = 0;
        for(int i = 0; i <= maxRow; i ++) {
            allhas += (long)m - (long)linehas[i];
        }
        if (allhas >= k) {
            for(int i = 0; i <= maxRow; i ++) {
                long has = m - linehas[i];
                if (k >= has){
                    linehas[i] = m;
                    k -= has;
                }else {
                    linehas[i] += k;
                    k = 0;
                }
            }
            return true;
        }
        return false;
    }
}

/**
 * Your BookMyShow object will be instantiated and called as such:
 * BookMyShow obj = new BookMyShow(n, m);
 * int[] param_1 = obj.gather(k,maxRow);
 * boolean param_2 = obj.scatter(k,maxRow);
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值