• 【leetcode周赛总结】LeetCode第 81 场双周赛(6.25)


    周赛链接:竞赛 - 力扣 (LeetCode)81场双周赛

    题目1 2315. 统计星号

    思路:

    简单题目直接遍历,用一个变量标识是否在竖线对之内

    代码:

    1. class Solution {
    2. public int countAsterisks(String s) {
    3. int count = 0;
    4. int d = 0;
    5. for(char c:s.toCharArray()){
    6. if(d==1){
    7. if(c=='|'){
    8. d = 0;
    9. }
    10. }else{
    11. if(c=='|'){
    12. d = 1;
    13. }
    14. if(c=='*'){
    15. count++;
    16. }
    17. }
    18. }
    19. return count;
    20. }
    21. }

    题目2 统计无向图中无法互相到达点对数

    思路:

    并查集,并查集的参考模板见【算法笔记】重点总结并查集_Let it beSun的博客-CSDN博客

    主要求每个连通分量的大小

    一开始TLE(超时)的思路:求出每个连通分量的大小之后直接用乘法计算

    例如:

    此时几个联通分量的大小分别为{4,2,1}此时计算 ans = 4*2+4*1+2*1 = 14

    但是时间复杂度O(n^2)超时;

    计算方法一

    所以考虑对于每一个节点,计算节点i不联通的点对数,因为每一个节点分别计算存在重复,所以答案就是求和再除以2。

    1. for(int i=0;i<n;i++){
    2. ans += (long)(n-sz[find(i)]);
    3. }
    4. return ans/2;

    计算方法二

    可以考虑对于所有的点对数 n*(n-1)/2 ,减去各个联通分量内部的节点对数 a*(a-1)/2

    代码:

    对应计算方法一:

    1. class Solution {
    2. int[] f = new int[100005];
    3. int[] sz = new int[100005];
    4. public int find(int x){
    5. if(f[x]==x) return x;
    6. return f[x] = find(f[x]);
    7. }
    8. public void unite(int x,int y){
    9. int fx = find(x);
    10. int fy = find(y);
    11. if(fx!=fy){
    12. f[fx] = fy;
    13. sz[fy] += sz[fx];
    14. sz[fx] = 0;
    15. }
    16. }
    17. public long countPairs(int n, int[][] edges) {
    18. for(int i=0;i<n;i++){
    19. f[i] = i;
    20. sz[i] = 1;
    21. }
    22. long ans = 0;
    23. for(int i=0;i<edges.length;i++){
    24. int a = edges[i][0];
    25. int b = edges[i][1];
    26. unite(a,b);
    27. }
    28. for(int i=0;i<n;i++){
    29. ans += (long)(n-sz[find(i)]);
    30. }
    31. return ans/2;
    32. }
    33. }

    对应计算方法二:

    1. class Solution {
    2. int[] f = new int[100005];
    3. int[] sz = new int[100005];
    4. public int find(int x){
    5. if(f[x]==-1) return x;
    6. return f[x] = find(f[x]);
    7. }
    8. public void unite(int x,int y){
    9. int fx = find(x);
    10. int fy = find(y);
    11. if(fx!=fy){
    12. f[fx] = fy;
    13. sz[fy] += sz[fx];
    14. sz[fx] = 0;
    15. }
    16. }
    17. public long countPairs(int n, int[][] edges) {
    18. for(int i=0;i<n;i++){
    19. f[i] = -1;
    20. sz[i] = 1;
    21. }
    22. long ans = 0;
    23. for(int i=0;i<edges.length;i++){
    24. int a = edges[i][0];
    25. int b = edges[i][1];
    26. unite(a,b);
    27. }
    28. for(int i=0;i<n;i++){
    29. if(f[i]==-1){
    30. ans += (long)sz[i]*(sz[i]-1)/2;
    31. }
    32. }
    33. return (long)n*(n-1)/2-ans;
    34. }
    35. }

    题目3  2317. 操作后的最大异或和

    思路

      就是统计这个数组中每一位是否出现1,对于所有二进制位,只要这一位在数组中出现过 1,那么答案里这一位也是 1

    因此答案就是所有数按位或的结果。复杂度 O(n)。

    代码

    方法一:直接统计

    1. class Solution {
    2. public int maximumXOR(int[] nums) {
    3. int[] bit = new int[32];
    4. for(int i=0;i<32;i++){
    5. for(int num:nums){
    6. if( ((num>>i)&1) == 1){
    7. bit[i]++;
    8. break;
    9. }
    10. }
    11. }
    12. int res = 0;
    13. int t = 1;
    14. for(int i=0;i<32;i++){
    15. if(i!=0){
    16. t = t*2;
    17. }
    18. res += bit[i]==0?0:t;
    19. }
    20. return res;
    21. }
    22. }

     方法二:按位或

    1. public int maximumXOR(int[] nums) {
    2. int ans = 0;
    3. for (int num : nums) ans |= num;
    4. return ans;
    5. }

  • 相关阅读:
    02- 数据结构与算法 - 最长回文子串(动态规划/中心扩展算法/Manacher 算法)
    CockroachDB集群部署
    Spring Cloud---使用gateway实现路由转发和负责均衡
    不支持TLS的设备如何实现游客登录加密通信方案
    【力扣】994.腐烂的橘子
    卷积神经网络的算法过程,卷积神经网络算法实现
    selenium headless 无头模式慢
    js中的地狱回调是什么
    分布式软件开发的相关技术
    MySQL数据库 面试题 补充
  • 原文地址:https://blog.csdn.net/weixin_40760678/article/details/125543521