K 빈 슬롯은 정원사의 딜레마를 올바르게 나타내며 우리의 조건에 맞는 꽃을 선택하려고합니다.
우리 정원사는 N 슬롯 필드가 있습니다. 정원사는 각 슬롯에 꽃을 심었습니다. 각각의 꽃은 특정에 피어 유일한 일. 또한 상록 꽃을 심었습니다. 꽃이 피면 고려 개화 영원히.
각각의 꽃이 피는 날은 1에서 N까지의 값 범위를 갖는 배열에 저장됩니다. 배열의 숫자는 개화 상태에 도달 할 날을 나타냅니다. 따라서 꽃 [i] = x. x 번째 꽃은 i 일에 피게됩니다.
차례
개화 상태는 어떻습니까?
K는 우리가 처리 할 숫자입니다. 두 꽃이 그 사이에 k 개의 꽃이 피지 않는 꽃이 피는 날을 찾을 것입니다. K 빈 슬롯 뒤에 숨겨진 수수께끼가 풀리나요?
이미지는 천 단어를 말합니다. 따라서 과장하기보다는 입력을 위해 샘플을 살펴 보겠습니다.
입력:
꽃 : [5,3,1,4,2]
k : 1
출력 : 2
둘째 날에는 세 번째와 다섯 번째 꽃이 피고 아직 꽃이 피고 있습니다.
같은 것을 보여주는 이미지
문제에 접근하는 방법?
제가 설명하려는 접근 방식은 슬라이딩 윈도우 접근 방식을 사용합니다. 이 주제에 대한 다양한 문제가 있습니다. 체크 아웃 자세히 알아보기 전에
더 이상 지체하지 않고 K Empty Slots의 솔루션으로 바로 이동하겠습니다.
- 우리가 만들자 정렬 특정 날짜에 피는 꽃 번호의 위치를 유지하기 위해 명명 된 날짜
- Days [flower [i] -1]은 i + 1의 위치를 유지합니다.
- 답변을 유지하기 위해 가변 최소값을 유지합니다.
- 위의 두 단계는 슬라이딩 윈도우를 진행하는 데 도움이되므로 진행하는 데 중요합니다.
- 따라서 K 개의 빈 슬롯에 대한 슬라이딩 창으로 시작합니다.
- 우리는 k + 2 크기의 슬라이딩 윈도우를 유지합니다.
- 언제든지 left = i이면 right = i + k + 1
- 각 요소가 왼쪽과 오른쪽보다 큰지 확인합니다.
- 우리가이 규칙을 지키는 한 계속해서
- 그렇지 않은 경우 다음 창을 고려합니다.
- 창 끝에 도달하면 왼쪽 및 오른쪽 요소의 최대 값을 확인합니다.
- 그런 다음 얻은 값을 최소값에있는 현재 값과 비교합니다.
위에서 설명한 과정은 피는 꽃 사이에 늦게 꽃이 피는 조건을 따르는 완벽한 하위 배열을 찾는 과정입니다.
K- 빈 슬롯에 대한 Java 코드
import java.util.*; public class kslots { public static int emoty(int[] blooms,int k) { int days[]=new int[blooms.length]; for(int i=0;i<days.length;i++) { days[blooms[i]-1]=i+1; } int left =0; int right =k+1; int min =Integer.MAX_VALUE; for(int i=1;right<days.length;i++) { if(days[i]>days[left] && days[i]>days[right]) continue; if(i==right) min=Math.min(min,Math.max(days[left],days[right])); left =i; right =left+k+1; } if(min==Integer.MAX_VALUE) return -1; else return min; } public static void main(String args[]) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int blooms[]=new int[n]; for(int i=0;i<n;i++) blooms[i]=sc.nextInt(); int k=sc.nextInt(); int num=emoty(blooms,k); System.out.println(num); } }
K- 빈 슬롯에 대한 C ++ 코드
#include<iostream> using namespace std; int maxs(int a,int b) { if(a>b) return a; else return b; } int mins(int a,int b) { if(a>b) return b; else return a; } int emoty(int blooms[],int k) { unsigned int m=(sizeof(blooms)/sizeof(blooms[0])); int days[m]; for(int i=0;i<m;i++) { days[blooms[i]-1]=i+1; } int left =0; int right =k+1; int min =9999; for(int i=1;right<m;i++) { if(days[i]>days[left] && days[i]>days[right]) continue; if(i==right) min=mins(min,maxs(days[left],days[right])); left=i; right=left+k+1; } if(min=9999) return -1; else return min; } int main() { int n,k; cin>>n; int blooms[n]; for(int i=0;i<n;i++) cin>>blooms[i]; cin>>k; int num=emoty(blooms,k); cout<<num; }
[5,3,1,4,2] 1
2
복잡성 분석
알고리즘의 시간 복잡도 = O (n)
알고리즘의 공간 복잡도 = O (n)
K 빈 슬롯은 어떻습니까?
- 배열을 반복하면서 사소한 작업 인 슬라이딩 창을 선택합니다.
- 최악의 경우 슬라이딩 창이 각 요소를 하나씩 통과 할 수 있습니다.
- 이것은 알고리즘 O (n)의 런타임 복잡성을 만듭니다.
- 이 문제뿐만 아니라이 프로토콜에서 발생하는 다른 문제는 O (n) 시간을 포함합니다.
- 전체 배열의 복사본을 만들 때 공간 복잡성은 O (n)입니다.
이 설명이 K 빈 슬롯 굉장하고 이해할 수있었습니다!
Tutorialcup을 계속 시청하세요 😀