首页 > 其他分享 >LeeCode 317周赛复盘

LeeCode 317周赛复盘

时间:2022-10-30 16:35:02浏览次数:81  
标签:node 周赛 temp get int list 317 map LeeCode

T1: 可被3整数的偶数的平均值

思路:数组遍历

被3整数的偶数 \(\Leftrightarrow\) 被6整数的数

public int averageValue(int[] nums) {
  int sum = 0;
  int count = 0;
  for (int num : nums) {
    if (num % 6 == 0) {
      sum += num;
      count += 1;
    }
  }

  if (count == 0) {
    return 0;
  }

  return sum / count;
}

T2: 最流行的视频创作者

思路:数组遍历 + 哈希

key: 对应创作者

value: 对应一个列表,list.get[0]表示创作者视频流量总和,list.get[1]表示创作者单个视频流量最大值,list.get[3] 表示创作者单个视频流量最大值对应的id

public List<List<String>> mostPopularCreator(String[] creators, String[] ids, int[] views) {
  Map<String, List<String>> map = new HashMap<>();

  long maxValue = 0;
  for (int i = 0; i < creators.length; ++i) {
    if (!map.containsKey(creators[i])) {
      maxValue = Math.max(maxValue, views[i]);
      List<String> list = new ArrayList<>();
      list.add(String.valueOf(views[i]));
      list.add(String.valueOf(views[i]));
      list.add(ids[i]);

      map.put(creators[i], list);
    }
    else {
      List<String> list = map.get(creators[i]);

      long sum = Long.valueOf(list.get(0));
      int max = Integer.valueOf(list.get(1));

      sum += views[i];
      maxValue = Math.max(maxValue, sum);
      if (max < views[i]) {
        list.set(2, ids[i]);
        max = views[i];
      }
      else if (max == views[i]) {
        if (list.get(2).compareTo(ids[i]) > 0) {
          list.set(2, ids[i]);
        }
      }
      list.set(0, String.valueOf(sum));  // 总体流量总和
      list.set(1, String.valueOf(max));  // 单个作者最大值

      map.put(creators[i], list);
    }
  }

  List<List<String>> res = new ArrayList<>();
  for (Map.Entry<String, List<String>> entry : map.entrySet()) {
    String key = entry.getKey();
    List<String> value = entry.getValue();

    if (Long.valueOf(value.get(0)) == maxValue) {
      List<String> temp = new ArrayList<>();
      temp.add(key);
      temp.add(value.get(2));

      res.add(temp);
    }
  }

  return res;
}

T3: 美丽整数的最小增量

思路:贪心

  • 如果低位的值 value 不等于0,则使该为加上 10 - value 产生进位,从而减小数位和
  • 循环向高位贪心直至数位和满足小于等于 target 的要求
public long makeIntegerBeautiful(long n, int target) {
  List<Integer> list = new ArrayList<>();
  int bitSum = 0;
  while (n > 0) {
    int temp = (int) (n % 10);
    n /= 10;

    bitSum += temp;
    list.add(temp);
  }

  if (bitSum <= target) {
    return 0;
  }

  int index = 0;
  long ans = 0;
  while (bitSum > target) {
    int bit = list.get(index);
    if (bit == 0) {
      index += 1;
      continue;
    }

    ans = ans + (long) Math.pow(10, index) * (10 - bit);
    index += 1;

    int temp = index;
    
    // 注意:如果左边第一位为9,会循环产生进位
    while (temp < list.size() && list.get(temp) == 9) {
      list.set(temp, 0);
      bitSum -= 9;
      temp += 1;
    }

    if (temp == list.size()) {
      list.add(1);
    }
    else {
      list.set(temp, list.get(temp) + 1);
    }
    bitSum = bitSum - bit + 1;
  }

  return ans;
}

T4: 移除子树后的二叉树高度

思路:深度优先搜索

  • 第一次深度优先搜索:计算每个节点的高度值
  • 第二次深度优先搜索:计算去除当前节点为根是子树后,剩余子树的高度值
private Map<TreeNode, Integer> map = new HashMap<>();
private int[] res;
public int[] treeQueries(TreeNode root, int[] queries) {
  dfs(root);
  map.put(null, 0);

  res = new int[map.size() + 1];
  dfs2(root, -1, 0);

  for (int i = 0; i < queries.length; ++i) {
    queries[i] = res[queries[i]];
  }

  return queries;
}


/**
 * 第一次DFS: 获取每个节点的高度
 * @param node
 * @return
 */
private int dfs(TreeNode node) {
  if (node == null) {
    return 0;
  }

  int height =  1 + Math.max(dfs(node.left), dfs(node.right));
  map.put(node, height);

  return height;
}


/**
 * 第二次DFS: 删除以当前节点为根的子树后, 剩余子树的最大高度
 * @param node: 当前节点
 * @param height: 当前节点高度
 * @param residue: 去除以当前节点为根的子树的高度
 */
private void dfs2(TreeNode node, int height, int residue) {
  if (node == null) {
    return;
  }

  height += 1;
  res[node.val] = residue;

  dfs2(node.left, height, Math.max(residue, height + map.get(node.right)));
  dfs2(node.right, height, Math.max(residue, height + map.get(node.left)));
}

总结

  • 前3题完成的都挺顺利
  • 第4题思路能想到是 DFS,但是自己每次不同的 query 都去深搜导致超时,没能想到第一遍深搜统计高度值,第二遍深搜计算答案

标签:node,周赛,temp,get,int,list,317,map,LeeCode
From: https://www.cnblogs.com/ylyzty/p/16841561.html

相关文章

  • leetcode 第90场双周赛
    6226.摧毁一系列目标题意:对于数组中每一个数nums[i],可以摧毁数组中值等于nums[i]+c*space的数(c为非负整数),求摧毁最大数量时的最小nums[i]思路:如果两个数x,y可以同时被摧......
  • acwing第75场周赛
    这次题比较水,但是还是没能ak,自己小结一下吧第一道题就是自己枚举相加就行第二道题是一个多关键字排序,wa了几次,是因为优先级有两个是相同的需要特判一下,然后可以把字符转......
  • 【LeeCode】字符串的全排列
    【题目描述】输入字符串str,返回str的字符的全排序【示例】输入:qwe输出:qweqewewqeqwwqeweq注意:如果输入的是n个相同的字符,那么也就只有1种排列组合【代码】list:保留......
  • 【LeeCode】字符串的排列
    【题目描述】给你两个字符串 ​​s1​​​ 和 ​​s2​​​ ,写一个函数来判断 ​​s2​​​ 是否包含 ​​s1​​ 的排列。如果是,返回 ​​true​​​ ;否则,返回 ......
  • 20201317 LYX 第九周学习总结
    信号和信号处理知识点总结介绍信号和中断的统一处理,有助于从正确的角度看待信号;将信号视为进程中断,将进程从正常执行转移到信号处理;解释信号的来源;解释Unix/Linux......
  • 【LeeCode】汇总
    ​​【LeeCode】排序算法​​​​【LeeCode】颜色分类​​​​【LeeCode】三数之和​​......
  • P3178 [HAOI2015]树上操作
    #include<iostream>usingnamespacestd;#defineintlonglongconstintN=100000+1;intn,m,a[N];structnode{inttag,sum;};nodetree[......
  • 【LeeCode】三数之和
    【题目描述】给你一个整数数组 ​​nums​​​ ,判断是否存在三元组 ​​[nums[i],nums[j],nums[k]]​​​ 满足 ​​i!=j​​​、​​i!=k​​​ 且 ​​j!=......
  • 牛客OI周赛7-普及组
    这一场感觉良好也只能打这种普及组长长信心这样子A:救救喵咪给你坐标轴上的个点,求出对于每个点,有多少个点的坐标和坐标都大于它。()是开玩笑的吧直接#include<iostream>#d......
  • 2022级HAUT新生周赛题解汇总
    2022级HAUT新生周赛(零)题解@:2022级HAUT新生周赛(一)题解@卞子骏:2022级HAUT新生周赛(二)题解@武其轩:2022级HAUT新生周赛(三)题解@焦小航:2022级HAUT新生周赛(四)题解@张子豪:202......