목차
머리말:
이 글의 시작 부분에서 슬라이딩 윈도우 알고리즘 유형에 대한 주제를 소개하겠습니다. 슬라이딩 윈도우는 실제로는 이중 포인터이지만 앞서 소개한 이중 포인터는 서로를 향해 움직입니다.
슬라이딩 윈도우는 같은 방향으로 이동합니다.
이 문서에서는 두 가지 주제를 통해 슬라이딩 창의 기본 사용법을 소개합니다.
3. 반복되는 문자가 없는 가장 긴 부분 문자열 - LeetCode
세 단계를 거쳐 소개되는데, 첫 번째 단계는 문제 분석, 두 번째 단계는 알고리즘 원리, 세 번째 단계는 알고리즘 작성입니다. 마찬가지로 문제 분석 부분에서도 폭력적인 해결책이 있는지 확인하겠습니다. , 첫 번째 단계로 가보겠습니다.
최소 길이의 하위 배열
질문 분석
질문의 요구 사항은 간격의 값의 합이 대상보다 크거나 같도록 연속 간격을 찾는 것입니다. 이 유형의 간격이 있는 경우 반환 값은 최소 길이가 되어야 합니다. 이 간격. 그러한 하위 배열이 없으면 0이 반환되어야 합니다.
그러면 두 가지 예가 있습니다. 그렇다면 이 문제를 폭력적으로 해결할 수 있을까요? 물론 가능합니다.
이 조건을 충족하는 모든 구간을 찾아 그 길이를 결정하면 됩니다. 그러나 시간 복잡도는 확실히 O(N^2)이므로 이 문제에서는 시간 초과가 발생하므로 학생들이 시도해 볼 수 있습니다. 그들 자신의.
그렇다면 언뜻 보면 이 질문이 슬라이딩 윈도우를 사용할 수 있는 이유는 무엇일까요?
필요한 것은 연속적인 공간이기 때문에 경험상 연속적인 공간이 필요한 문제에 직면하면 슬라이딩 창 쪽으로 몸을 기울이는 것이 좋습니다.
이제 알고리즘 원리 부분을 살펴보겠습니다.
알고리즘 원리
슬라이딩 윈도우의 본질은 두 포인터가 같은 방향으로 이동한다는 것입니다. 이 두 포인터의 이동을 통해 간격의 합이 만족되는지 확인하고 만족한다면 길이를 비교합니다.
그렇다면 슬라이딩 윈도우를 사용한다면 어떨까요?
두 포인터의 시작점은 처음에는 동일해야 합니다. 두 포인터의 위치가 동일하지 않으면 이 간격의 합을 구체적으로 찾기 위해 추가 루프를 추가해야 하므로 이제 다음과 같습니다.
int left = 0, right = 0;
이것은 확실합니다. 그러면 슬라이딩 창의 경우 두 개의 명사를 기억할 수 있습니다. 하나는 진입 창이고 다른 하나는 종료 창입니다. 언제 창에 들어가고 종료 창이 무엇인지가 우리의 주제입니다.
창을 입력한다는 것은 간격의 합이 <target이므로 더 많은 숫자가 포함되어야 함을 의미하므로 질문 자체에는 양의 정수가 필요하므로 숫자가 다음과 같은지 확인하면 됩니다. 가능한 한 크게.
창 밖은 간격의 합 > 목표라는 뜻으로, 그냥 창 밖으로 나가서 내부에 존재하는 최소 길이를 판단하면 됩니다.
기본 원칙은 들어가고 나가면 문제를 성공적으로 해결할 수 있다는 것입니다.
알고리즘 작성
class Solution
{
public:
int minSubArrayLen(int target, vector<int>& nums)
{
int ans = INT_MAX, left = 0, right = 0 ,sum = 0;
for(;right < nums.size();right++)
{
sum += nums[right];
while(sum >= target)
{
ans = min(ans,right - left + 1);//如果ans为0 那么这一步永远都是0
sum -= nums[left++];
}
}
return ans == INT_MAX ? 0 : ans;
}
};
그런데 이 질문의 역겨운 점은 초기 길이를 아주 큰 숫자로 정의하지 않으면 판단하고 비교할 때 min을 통해 가장 작은 숫자를 구할 수 없기 때문에 ans를 INT_MAX로 정의해야 하고, 크기가 큰 한, 번호, 괜찮아요.
이 시점에서 주제 분석이 완료됩니다.
반복 길이가 없는 최소 문자열
질문 분석
질문은 매우 짧습니다. 통과 조건은 반복되는 문자 없이 가장 긴 문자열의 길이를 반환하는 것입니다. 따라서 문자의 경우 질문에 제공된 요구 사항은 다음과 같습니다.
따라서 중복이 있는지 확인하려면 일종의 매핑이 있는지 확인하는 방법이 필요하며 여기서는 해시 맵을 사용하고 배열을 사용하여 해시 테이블을 모방할 수 있습니다. 문제 해결에 폭력이 있는지 여부를 판단할 수도 있습니다.
두 개의 for 루프를 사용합니다. 두 번째 루프는 마지막 요소를 찾아 매핑 값이 1보다 큰지 확인합니다. 1보다 큰 경우 직접 반환될 수 있습니다. 시간복잡도는 O(N^2)로 무난합니다.
하지만 이 질문의 특성은 간격이므로 슬라이딩 창을 사용하여 답변할 수도 있습니다.
알고리즘 원리
이전 질문의 슬라이딩 윈도우는 길이가 가장 작은 하위 배열입니다. 판단 조건은 >= target보다 크거나 같습니다. 이 질문의 판단 조건은 해시 맵이 1보다 큰지 여부입니다. 따라서 결론이 도출됩니다. : 슬라이딩 창을 이용한 세 가지 문제가 있습니다. 첫 번째 단계는 창에 들어가는 것, 두 번째는 판단하는 것, 세 번째는 창에서 나가는 것입니다 .
다음 질문은 모두 이 절차를 매우 엄격하게 사용합니다.
그런 다음 판단 방법도 해시 매핑을 사용하는 것입니다. 판단 매핑이 1보다 크면 출력이 완료된 후 해당 ans가 기록되거나 매핑이 조건을 충족하면 해당 ans가 출력됩니다. 도 녹음됩니다.
마지막으로 ans를 반환하세요.
알고리즘 작성
class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
int hash[256] = { 0 }, ans = 0;
for(int left = 0, right = 0;right < s.size();right++)
{
hash[s[right]]++;
while(hash[s[right]] > 1)
{
hash[s[left++]]--;
}
ans = max(ans,right - left + 1);
}
return ans;
}
};
슬라이딩 윈도우의 시작이 끝났습니다~
읽어주셔서 감사합니다!