Input: nums =[1,2,3], target =5Output: 2Explanation: In this example infinite_nums =[1,2,3,1,2,3,1,2,...].The subarray in the range [1,2], has the sum equal to target =5 and length =2.It can be proven that 2is the shortest length of a subarray with sum equal to target =5.
Input: nums =[1,1,1,2,3], target =4Output: 2Explanation: In this example infinite_nums =[1,1,1,2,3,1,1,1,2,3,1,1,...].The subarray in the range [4,5], has the sum equal to target =4 and length =2.It can be proven that 2is the shortest length of a subarray with sum equal to target =4.
Input: nums =[2,4,6,8], target =3Output: -1Explanation: In this example infinite_nums =[2,4,6,8,2,4,6,8,...].It can be proven that there is no subarray with sum equal to target =3.
Since the array is repeated infinitely, we can simulate up to two rounds of nums (length up to 2n) to cover all possible subarrays. Use prefix sums and a hash map to find the shortest subarray with sum equal to target.
#include<unordered_map>classSolution {
public:int minSizeSubarray(vector<int>& nums, int target) {
int n = nums.size();
long sum =0;
for (int x : nums) sum += x;
int res = INT_MAX;
vector<long> prefix(2*n+1, 0);
for (int i =0; i <2*n; ++i) prefix[i+1] = prefix[i] + nums[i%n];
unordered_map<long, int> mp;
for (int i =0; i <=2*n; ++i) mp[prefix[i]] = i;
for (int i =0; i <=2*n; ++i) {
long need = prefix[i] - target;
if (mp.count(need)) res = min(res, i - mp[need]);
}
if (target % sum ==0) return (target/sum)*n;
return res == INT_MAX ?-1: res;
}
};
import java.util.*;
classSolution {
publicintminSizeSubarray(int[] nums, int target) {
int n = nums.length;
long sum = 0;
for (int x : nums) sum += x;
int res = Integer.MAX_VALUE;
long[] prefix =newlong[2*n+1];
for (int i = 0; i < 2*n; i++) prefix[i+1]= prefix[i]+ nums[i%n];
Map<Long, Integer> mp =new HashMap<>();
for (int i = 0; i <= 2*n; i++) mp.put(prefix[i], i);
for (int i = 0; i <= 2*n; i++) {
long need = prefix[i]- target;
if (mp.containsKey(need)) res = Math.min(res, i - mp.get(need));
}
if (target % sum == 0) return (int)(target/sum)*n;
return res == Integer.MAX_VALUE?-1 : res;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classSolution {
funminSizeSubarray(nums: IntArray, target: Int): Int {
val n = nums.size
val sum = nums.sum().toLong()
var res = Int.MAX_VALUE
val prefix = LongArray(2*n+1)
for (i in0 until 2*n) prefix[i+1] = prefix[i] + nums[i%n]
val mp = mutableMapOf<Long, Int>()
for (i in0..2*n) mp[prefix[i]] = i
for (i in0..2*n) {
val need = prefix[i] - target
if (mp.containsKey(need)) res = minOf(res, i - mp[need]!!)
}
if (target % sum ==0L) return (target/sum).toInt()*n
returnif (res ==Int.MAX_VALUE) -1else res
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution:
defminSizeSubarray(self, nums: list[int], target: int) -> int:
n, s = len(nums), sum(nums)
if target % s ==0:
return (target // s) * n
prefix = [0]
for i in range(2*n):
prefix.append(prefix[-1] + nums[i % n])
mp = {v: i for i, v in enumerate(prefix)}
res = float('inf')
for i, v in enumerate(prefix):
need = v - target
if need in mp:
res = min(res, i - mp[need])
return-1if res == float('inf') else res
use std::collections::HashMap;
impl Solution {
pubfnmin_size_subarray(nums: Vec<i32>, target: i32) -> i32 {
let n = nums.len();
let sum: i64= nums.iter().map(|&x| x asi64).sum();
if target asi64% sum ==0 { return (target asi64/ sum * n asi64) asi32; }
letmut prefix =vec![0i64];
for i in0..2*n { prefix.push(prefix.last().unwrap() + nums[i%n] asi64); }
letmut mp = HashMap::new();
for (i, &v) in prefix.iter().enumerate() { mp.insert(v, i); }
letmut res =i32::MAX;
for (i, &v) in prefix.iter().enumerate() {
let need = v - target asi64;
iflet Some(&j) = mp.get(&need) {
res = res.min((i-j) asi32);
}
}
if res ==i32::MAX { -1 } else { res }
}
}