本文介绍: 解释我们无法移除任何一个元素使得和被 9 整除最优方案是移除数组 [5,2] ,剩余元素为 [6,3],和为 9。我们可以移除数组 [4] ,剩余元素的和为 6。输入nums = [1000000000,1000000000,1000000000], p = 3。输入nums = [3,1,4,2], p = 6。输入nums = [6,3,5,2], p = 9。输入nums = [1,2,3], p = 3。输入nums = [1,2,3], p = 7。,值就是其对应下标

题目链接

Leetcode.1590 使数组和能被 P 整除 rating : 2039

题目描述

给你一个正整数数组

n

u

m

s

nums

nums,请你移除 最短数组可以),使得剩余元素 能被

p

p

p 整除不允许 将整个数组都移除

请你返回需要移除的最短子数组长度,如果无法满足题目要求,返回

1

-1

1

数组 定义为原数组中连续的一组元素

示例 1:

输入nums = [3,1,4,2], p = 6
输出:1
解释nums 中元素和为 10,不能被 p 整除我们可以移除子数组 [4] ,剩余元素的和为 6 。

示例 2:

输入nums = [6,3,5,2], p = 9
输出:2
解释:我们无法移除任何一个元素使得和被 9 整除最优方案是移除子数组 [5,2] ,剩余元素为 [6,3],和为 9 。

提示3:

输入:nums = [1,2,3], p = 3
输出:0
解释:和恰好为 6 ,已经能被 3 整除了。所以我们不需要移除任何元素。

提示4:

输入:nums = [1,2,3], p = 7
输出:-1
解释:没有任何方案使得移除子数组后剩余元素的和被 7 整除

提示5:

输入:nums = [1000000000,1000000000,1000000000], p = 3
输出:0

提示
  • 1

    n

    u

    m

    s

    .

    l

    e

    n

    g

    t

    h

    1

    0

    5

    1 leq nums.length leq 10^5

    1nums.length105

  • 1

    n

    u

    m

    s

    [

    i

    ]

    1

    0

    9

    1 leq nums[i] leq 10^9

    1nums[i]109

  • 1

    p

    1

    0

    9

    1 leq p leq 10^9

    1p109

解法前缀和 + 哈希

假设个数

n

u

m

s

nums

nums 的和为

s

s

s,那么

k

=

s

 

m

o

d

 

p

k = s mod p

k=s mod p

  • 如果

    k

    =

    0

    k = 0

    k=0说明个数组的和都可以

    p

    p

    p 整除,所以不需要移除元素,直接返回

    0

    0

    0

  • 如果

    k

    0

    k neq 0

    k=0假设我们需要移除的这个子数组和为

    t

    t

    t,那么

    t

     

    m

    o

    d

     

    p

    =

    k

    t mod p = k

    t mod p=k,并且还要要求这个子数组的长度是最短的。

假设区间

[

j

,

i

]

[j,i]

[j,i] 的子数组满足这个条件,我们用

s

u

m

sum

sum 表示

n

u

m

s

nums

nums前缀和,即:

(

s

u

m

[

i

]

s

u

m

[

j

1

]

)

 

m

o

d

 

p

=

k

(sum[i] – sum[j-1]) mod p = k

(sum[i]sum[j1]) mod p=k

转换一下:

s

u

m

[

j

1

]

 

m

o

d

 

p

=

s

u

m

[

i

]

 

m

o

d

 

p

k

sum[j-1] mod p = sum[i] mod p – k

sum[j1] mod p=sum[i] mod pk

由于

s

u

m

[

j

]

 

m

o

d

 

p

k

sum[j] mod p – k

sum[j] mod pk 有可能是负数,所以我们需要再将其转换整数

s

u

m

[

j

1

]

 

m

o

d

 

p

=

(

s

u

m

[

i

]

 

m

o

d

 

p

k

+

p

)

 

m

o

d

 

p

sum[j-1] mod p = (sum[i] mod p – k + p) mod p

sum[j1] mod p=(sum[i] mod pk+p) mod p

我们用哈希表来记录这个

s

u

m

[

i

]

 

m

o

d

 

p

sum[i] mod p

sum[i] mod p,值就是其对应下标

i

i

i

我们令

k

e

y

=

(

s

u

m

[

i

]

 

m

o

d

 

p

k

+

p

)

 

m

o

d

 

p

key = (sum[i] mod p – k + p) mod p

key=(sum[i] mod pk+p) mod p,如果对于当前

k

e

y

key

key哈希

m

p

mp

mp 中有记录,则

j

=

m

p

[

k

e

y

]

j = mp[key]

j=mp[key]说明移除此时的子数组

[

j

,

i

]

[j,i]

[j,i] 就能使

n

u

m

s

nums

nums 的剩余元素满足条件,那么我们更新答案

a

n

s

ans

ans

注意:

时间复杂度

O

(

n

)

O(n)

O(n)

C++代码

using LL = long long;

class Solution {
public:
    int minSubarray(vector<int>&amp; nums, int p) {
        int n = nums.size();
        LL sum = 0;

        for(auto x:nums) sum += x;
        int k = sum % p;

        if(k == 0) return 0;

        unordered_map<int,int> mp{{0 , -1}};

        int ans = n;
        sum = 0;
        for(int i = 0;i < n;i++){
            sum += nums[i];
            auto key = (sum % p - k + p)%p;
            if(mp.find(key) != mp.end()){
                auto j = mp[key];
                ans = min(ans , i - j);
            }
    
            mp[sum % p] = i;
        }
        return ans == n ? -1 : ans;
    }
};

原文地址:https://blog.csdn.net/m0_74396439/article/details/134629697

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_14583.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注