zoukankan      html  css  js  c++  java
  • 1906. 查询差绝对值的最小值 前缀和

    一个数组 a 的 差绝对值的最小值 定义为:0 <= i < j < a.length 且 a[i] != a[j] 的 |a[i] - a[j]| 的 最小值。如果 a 中所有元素都 相同 ,那么差绝对值的最小值为 -1 。

    比方说,数组 [5,2,3,7,2] 差绝对值的最小值是 |2 - 3| = 1 。注意答案不为 0 ,因为 a[i] 和 a[j] 必须不相等。
    给你一个整数数组 nums 和查询数组 queries ,其中 queries[i] = [li, ri] 。对于每个查询 i ,计算 子数组 nums[li...ri] 中 差绝对值的最小值 ,子数组 nums[li...ri] 包含 nums 数组(下标从 0 开始)中下标在 li 和 ri 之间的所有元素(包含 li 和 ri 在内)。

    请你返回 ans 数组,其中 ans[i] 是第 i 个查询的答案。

    子数组 是一个数组中连续的一段元素。

    |x| 的值定义为:

    如果 x >= 0 ,那么值为 x 。
    如果 x < 0 ,那么值为 -x 。

    示例 1:

    输入:nums = [1,3,4,8], queries = [[0,1],[1,2],[2,3],[0,3]]
    输出:[2,1,4,1]
    解释:查询结果如下:

    • queries[0] = [0,1]:子数组是 [1,3] ,差绝对值的最小值为 |1-3| = 2 。
    • queries[1] = [1,2]:子数组是 [3,4] ,差绝对值的最小值为 |3-4| = 1 。
    • queries[2] = [2,3]:子数组是 [4,8] ,差绝对值的最小值为 |4-8| = 4 。
    • queries[3] = [0,3]:子数组是 [1,3,4,8] ,差的绝对值的最小值为 |3-4| = 1 。
      示例 2:

    输入:nums = [4,5,2,2,7,10], queries = [[2,3],[0,2],[0,5],[3,5]]
    输出:[-1,1,1,3]
    解释:查询结果如下:

    • queries[0] = [2,3]:子数组是 [2,2] ,差绝对值的最小值为 -1 ,因为所有元素相等。
    • queries[1] = [0,2]:子数组是 [4,5,2] ,差绝对值的最小值为 |4-5| = 1 。
    • queries[2] = [0,5]:子数组是 [4,5,2,2,7,10] ,差绝对值的最小值为 |4-5| = 1 。
    • queries[3] = [3,5]:子数组是 [2,7,10] ,差绝对值的最小值为 |7-10| = 3 。

    提示:

    2 <= nums.length <= 105
    1 <= nums[i] <= 100
    1 <= queries.length <= 2 * 104
    0 <= li < ri < nums.length

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/minimum-absolute-difference-queries
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    class Solution {
    public:
        vector<int> minDifference(vector<int>& nums, vector<vector<int>>& queries) {
            int n = nums.size();
            // pre[i][j] 前i个数中,j出现的次数
            vector<vector<int>> pre(n + 1, vector<int>(105, 0));
            vector<int> ans;
    
            for (int i = 1; i <= n; i++) {
                int cur = nums[i - 1];
                for (int j = 0; j <= 100; j++) {
                    pre[i][j] = pre[i - 1][j];
                }
                pre[i][cur]++;
            }
    
            for (auto q : queries) {
                int l = q[0], r = q[1];
                int res = INT_MAX;
                int suffix = -1;
                for (int i = 0; i <= 100; i++) {
                    if (pre[r + 1][i] - pre[l][i] != 0) {
                        if (suffix != -1) {
                            res = min(res, abs(suffix - i));
                        }
                        suffix = i;
                    }
                }
                ans.push_back(res == INT_MAX ? -1 : res);
            }
    
            return ans;
        }
    };
    
  • 相关阅读:
    PAT B1027 打印沙漏 (20 分)
    PAT B1025 反转链表 (25 分)
    PAT B1022 D进制的A+B (20 分)
    PAT B1018 锤子剪刀布 (20 分)
    PAT B1017 A除以B (20 分)
    PAT B1015 德才论 (25 分)
    PAT B1013 数素数 (20 分)
    PAT B1010 一元多项式求导 (25 分)
    HDU 1405 The Last Practice
    HDU 1165 Eddy's research II
  • 原文地址:https://www.cnblogs.com/xgbt/p/14954915.html
Copyright © 2011-2022 走看看