LeetCode_单周赛_328

6291. 数组元素和与数字和的绝对差

在这里插入图片描述

代码

模拟即可

class Solution {
    public int differenceOfSum(int[] nums) {
        int ans = 0;
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            int t = nums[i];
            ans += t;
            while (t > 0) {
                sum += t % 10;
                t /= 10;
            }
        }
        return Math.abs(ans - sum);
    }
}

6292. 子矩阵元素加 1

在这里插入图片描述

代码

差分模板
但是在处理的时候,因为差分数组下标从 1 开始比较方便,所以我们让 q 中的值都 +1
最后返回结果时,原数组 = 差分数组的前缀和
为了符合下标从 0 开始的要求,我们定义数组 a,作为结果返回,存储时下标 -1 存储

class Solution {
    private int[][] b;
    public int[][] rangeAddQueries(int n, int[][] q) {
        b = new int[n + 10][n + 10];
        for (var a : q) {
            insert(a[0] + 1, a[1] + 1, a[2] + 1, a[3] + 1);
        }

        int[][] a = new int[n][n];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                b[i][j] += b[i][j - 1] + b[i - 1][j] - b[i - 1][j - 1];
                a[i - 1][j - 1] = b[i][j];
            }
        }
        return a;
    }

    private void insert(int x1, int y1, int x2, int y2) {
        b[x1][y1] += 1;
        b[x2 + 1][y1] -= 1;
        b[x1][y2 + 1] -= 1;
        b[x2 + 1][y2 + 1] += 1;
    }
}

6293. 统计好子数组的数目

在这里插入图片描述

代码

双指针
map存储每个数出现的次数
从左往右进行双指针,先左指针不动,一直右移右指针,直到满足条件 / 到达边界 为止
如果满足条件

  1. 则以 l 为左端点,r 右边的端点都满足。左端点为 l 的情况就找完了,不用再遍历左端点为 l 的情况了。
  2. 此时不断向右移动左指针,看是否满足(这一步用while,保证此时的右边界 r 不变)

不满足条件就继续移动

class Solution {
    public long countGood(int[] a, int k) {
        int l = 0, r = 1, n = a.length;
        long t = 0;
        long ans = 0;
        boolean[] vis = new boolean[n + 10];
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(a[l], 1);
        vis[0] = true;
        while (l < r && r < n) {
            if (!vis[r] && map.getOrDefault(a[r], 0) >= 1) {
                t += map.get(a[r]);
            }
            if (!vis[r]) map.put(a[r], map.getOrDefault(a[r], 0) + 1);
            vis[r] = true;
            
            
            while (t >= k) {
                ans += n - r;
                
                t -= map.get(a[l]) - 1;
                map.put(a[l], map.get(a[l]) - 1);
                l++;
            }
            r++;
        }
        
        return ans;
    }
}
posted @   Changersh  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示