[회전 알고리즘] 슬라이딩 창
6163 단어 면접 필기시험 문제
전체 배열 과 숫자 s 를 지정 합 니 다. 배열 에서 가장 짧 은 연속 서브 배열 을 찾 아 연속 서브 배열 의 숫자 와 sum > = s 를 찾 아 이 가장 짧 은 연속 서브 배열 의 반환 값 을 되 돌려 줍 니 다.
· 예 를 들 어 주어진 배열 [2, 3, 1, 2, 4, 3], s = 7
· 정 답 은 [4, 3], 귀환 2
폭력 해: 모든 연속 하위 그룹 을 옮 겨 다 니 기 [i, j]
합 sum 을 계산 하고 sum = s 를 검증 합 니 다.
시간 복잡 도 O (n ^ 3)
어떤 방법 으로 시간 복잡 도 를 O (n ^ 2) 로 최적화 할 수 있 습 니까?
#include
#include
#include
using namespace std;
class Solution{
public:
// :O(n)
// :O(1)
int minSubArrayLen(int s,vector& nums){
int l = 0;
int r = -1; //nums[l...r]
int sum = 0;
int res = nums.size() + 1;
while(l < nums.size() ){
if(r + 1 < nums.size() && sum < s){
r++;
sum += nums[r];
}
else{
sum -= nums[l++];
}
if(sum >= s){
res = min(res,r-l+1);
}
}
if(res == nums.size() + 1){
return 0;
}
return res;
}
};
int main(){
int arr[] = {4,2,4,6,8,9,10};
vector vec(arr,arr+sizeof(arr)/sizeof(int));
int ret = Solution().minSubArrayLen(12,vec);
cout << ret << endl;
return 0;
}
3.Longest Substring Without Repeating Characters
한 문자열 에서 중복 되 지 않 은 가장 긴 문자열 을 찾 습 니 다.
· "abcabcbb" 와 같이 결 과 는 "abc" 입 니 다.
· "bbbb" 와 같이 결 과 는 "b" 이다.
· "pwkew" 와 같이 결 과 는 "wrk" 입 니 다.
#include
#include
#include
#include
using namespace std;
class Solution{
public:
int lengthOfLongestSubstring(string s){
int freq[256] = {0};
int l = 0;
int r = -1; // s[l...r]
int res;
while(l < s.size()){
if(r+1 < s.size() && freq[s[r+1]] == 0){
r++;
freq[s[r]]++;
}
else{
freq[s[l++]]--;
}
res = max(res, r-l+1);
}
return res;
}
};
int main(){
string arr = "abcabcd";
int ret = Solution().lengthOfLongestSubstring(arr);
cout << ret << endl;
return 0;
}
438.Find All Anagrams in a String
문자열 s 와 비 어 있 는 문자열 p 를 지정 하고 P 의 모든 s 인 anagrams 문자열 의 하위 문자열 을 찾 아 하위 문자열 의 시작 색인 을 되 돌려 줍 니 다.
· 예 를 들 어 s = "cbaeabacd" p = "abc" 돌아 가기 [0, 6]
· 예 를 들 어 s = "abab", p = "ba", 반환 [0, 1, 2]
-- 문자 집합 범 위 는.영문 소문 자
-- 되 돌아 오 는 해 의 순 서 는.임 의
#include
#include
#include
#include
using namespace std;
class Solution{
public:
vector findAnagramsstring(string nums,string target){
assert(nums.size() > target.size());
vector sv(26,0);
vector pv(26,0);
vector res;
for(int i = 0; i < target.size(); i++){
++pv[target[i] - 'a'];
++sv[nums[i] - 'a'];
}
if(sv == pv) res.push_back(0);
for(int i = target.size(); i < nums.size();i++){
++sv[nums[i] - 'a'];
--sv[nums[i - target.size()] - 'a'];
if(pv == sv) res.push_back(i - target.size() + 1);
}
return res;
}
};
int main(){
string nums = "cbaebabacdcba";
string target = "cba";
vector vec = Solution().findAnagramsstring(nums,target);
for(int i = 0; i < vec.size(); i++){
cout << vec[i] << " ";
}
cout << endl;
return 0;
}
76.Minimum Window Substring
문자열 S 와 T 를 지정 합 니 다. S 에서 가장 짧 은 하위 문자열 을 찾 습 니 다. T 의 모든 문 자 를 포함 합 니 다.
· 예 를 들 어 S = "ADOBECODEBANC";T = “ABC”
· 결 과 는 'BANC'
-- 문자 범 위 는.
-- 풀 지 않 았 다 면."돌아 가기"
-- 여러 개의 풀이 가 있다 면. 하나만 풀 수 있 을 거 예요.
-- 모든 문 자 를 포함 한 다 는 게 무엇 인가.S=”a”,T = “a”;
#include
#include
#include
#include
using namespace std;
class Solution{
public:
string MinWinSubstring(string src,string T){
vector Sv(256,0);
vector Tv(256,0);
int lp = -1;
int rp = -1;
int answer = 0x7fffffff;
int begin = 0;
int lack = T.size();
for(int i = 0; i < T.size(); i++){
Tv[T[i]]++;
}
for(int end = 0; end < src.size(); end++){
if(Sv[src[end]] < Tv[src[end]]){
lack--;
}
Sv[src[end]]++;
if(lack == 0){
while(begin < end && Sv[src[begin]] > Tv[src[begin]]){
Sv[src[begin]]--;
begin++;
}
if(answer > end - begin + 1){
answer = end-begin+1;
lp = begin;
rp = end;
}
while(lack == 0){
Sv[src[begin]]--;
begin += 1;
lack += 1;
}
}
}
return lp == -1 ?" ": src.substr(lp,rp-lp+1);
}
};
int main(){
string src = "ADOBECODEBANC";
string T = "ABC";
string ret = Solution().MinWinSubstring(src,T);
cout << ret << endl;
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[회전 알고리즘] 슬라이딩 창전체 배열 과 숫자 s 를 지정 합 니 다. 배열 에서 가장 짧 은 연속 서브 배열 을 찾 아 연속 서브 배열 의 숫자 와 sum > = s 를 찾 아 이 가장 짧 은 연속 서브 배열 의 반환 값 을 되 돌려 줍 니...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.