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

LeeCode 316周赛复盘

时间:2022-10-23 19:22:36浏览次数:78  
标签:周赛 pairs index int res nums 316 long LeeCode

T1:判断两个事件是否存在冲突

思路:判断两个区间是否有交集

public boolean haveConflict(String[] event1, String[] event2) {
  // 比较 Unicode 字符, 使用 compareTo 函数
  if (event1[1].compareTo(event2[0]) < 0 || event2[1].compareTo(event1[0]) < 0) {
    return false;
  }

  return true;
}

T2:最大公因素等于 K 的子数组数目

思路:暴力枚举

/**
     * 求两个数的最大公因数
     * @param a
     * @param b
     * @required a <= b
     * @return
     */
public int gcd(int a, int b) {
  if (a == 0) {
    return b;
  }

  return gcd(b % a, a);
}

public int subarrayGCD(int[] nums, int k) {
  int res = 0;
  for (int i = 0; i < nums.length; i++) {
    if (nums[i] % k != 0) {
      continue;
    }

    int temp = nums[i];
    for (int j = i; j < nums.length; j++) {
      if (nums[j] % k != 0) {
        break;
      }

      temp = gcd(temp, nums[j]);
      if (temp % k != 0) {
        break;
      }

      if (temp == k) {
        res += 1;
      }
    }
  }

  return res;
}

T3:使数组相等的最小开销

思路:中位数贪心,将 cost[i] 转化为 nums[i] 出现的次数,就可以将题目转化为 LeeCode 462: 最小操作次数使数组元素相等II

注意数据大小:

  • counts 使用 int 会溢出,之前卡在这里答案一直出错
public long minCost(int[] nums, int[] cost) {
  int[][] pairs = new int[nums.length][2];

  long counts = 0;
  for (int i = 0; i < nums.length; i++) {
    pairs[i][0] = nums[i];
    pairs[i][1] = cost[i];

    counts += cost[i];
  }

  Arrays.sort(pairs, (o1, o2) -> {
    return o1[0] - o2[0];
  });

  counts /= 2;
  int index = 0;
  for (; index < pairs.length; index++) {
    counts -= pairs[index][1];
    if (counts < 0) {
      break;
    }
  }

  long res = 0;
  for (int i = 0; i < pairs.length; i++) {
    if (i == index) {
      continue;
    }

    long diff = Math.abs(pairs[i][0] - pairs[index][0]);
    long times = pairs[i][1];
    res += diff * times;
  }

  return res;
}

T4:使数组相似的最少操作

思路:奇偶排序 + 贪心选择

按奇偶分类并排序,让最小的一对,次小的一对,依次类推,最大的组成一对,可以得到 nums 数组变化量的最小值

public long makeSimilar(int[] nums, int[] target) {
  Arrays.sort(nums);
  Arrays.sort(target);

  long res = 0;

  // index[0] 表示 target 当前指向的偶元素位置
  // index[1] 表示 target 当前指向的奇元素位置
  int[] index = new int[2];

  for (int num : nums) {
    int temp = num % 2;
    while (target[index[temp]] % 2 != temp) {
      index[num % 2] += 1;
    }

    res += Math.abs(num - target[index[temp]]);
    index[temp] += 1;
  }

  return res / 4;
}

标签:周赛,pairs,index,int,res,nums,316,long,LeeCode
From: https://www.cnblogs.com/ylyzty/p/16819216.html

相关文章

  • 89 场双周赛
    2.二的幂数组中查询范围内的乘积解法1.暴力枚举n最大是1e9,未超出int表示范围,最多有30个2的幂查询数组最大是1e5暴力枚举的最差时间复杂度就是\(3e6\),不会超时时间复......
  • LC周赛复盘
    89场双周赛:做出题目数——三题315场周赛:做出题目数——三题89场卡题地方:https://leetcode.cn/contest/biweekly-contest-89/problems/number-of-valid-clock-ti......
  • AcWing 第72场周赛
    T1:直接模拟即可。#include<iostream>#include<cstring>#include<algorithm>#defineintlonglongusingnamespacestd;signedmain(){intt;cin>>t;......
  • 10月14日周赛
    今天又有周赛。第1、2题我做的很快。第3题遇到了问题,开始只得了10分,我不断修改,变成了80分。第4题,我把题目读懂了,就是在一个区间里找数,这数要像山峦一样,有小到大。开始得......
  • oracle 21c expdp报错误UDE-31623
     环境:OS:Centos7DB:21C 导出报错expdpc##goldengate/goldengate@tnspdb1tables=hxl.tb_testdumpfile=tb_test.dmpFLASHBACK_SCN=4990304parallel=5direct......
  • Leecode 111.二叉树的最小深度
    /**Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*......
  • Leecode104 二叉树的最大深度
    //DFS解法前序遍历/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*Tr......
  • acwing.第72场周赛 t3最小移动距离
    AcWing4626.最小移动距离原题链接:https://www.acwing.com/problem/content/4629/思路要求对于每一个点x都满足走过t,到达一个目标点y.并且x和y都可以互为目标点。找出......
  • 68周赛-价值匹配
    给定一个字符串集合 SS,SS 中包含 mm 个长度为 nn 的 0101 字符串,集合中可能包含重复元素。给定一个长度为 nn 的整数序列 w1,w2,…,wnw1,w2,…,wn。关于两个......
  • acwing.第71场周赛
    acwing4621.三个整数原题链接:https://www.acwing.com/problem/content/4624/解题思路题目保证一定有解,说明给的abcd是一定可以找到答案xyz的要求x+y>z让左边取......