음수가 아닌 숫자 목록과 대상 정수 k가 있다고 가정하고 배열에 k의 배수, 합계가 n*인 크기가 최소 2인 연속 하위 배열이 있는지 확인하는 함수를 작성해야 합니다. k 여기서 n은 정수이기도 합니다. 따라서 입력이 [23,2,4,6,7]이고 k =6인 경우 결과는 True가 됩니다. [2,4]는 크기가 2이고 합계가 6이 되기 때문입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- m 맵을 만들고 m[0] :=-1 및 sum :=0, n :=nums 배열의 크기로 설정
- 0 ~ n – 1 범위의 i에 대해
- 합계 :=합 + 숫자[i]
- k가 0이 아니면 sum :=sum mod k
- m에 합계가 있고 i – m[sum]>=2이면 true를 반환합니다.
- m에 합계가 없으면 m[sum] :=i로 설정합니다.
- 거짓 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool checkSubarraySum(vector<int>& nums, int k) {
unordered_map<int, int> m;
m[0] = -1;
int sum = 0;
int n = nums.size();
for(int i = 0; i < n; i++){
sum += nums[i];
if(k)
sum %= k;
if(m.count(sum) && i - m[sum] >= 2){
return true;
}
if(!m.count(sum)) m[sum] = i;
}
return false;
}
};
main(){
vector<int> v = {23,2,4,6,7};
Solution ob;
cout << (ob.checkSubarraySum(v, 6));
} 입력
[23,2,4,6,7] 6
출력
1