Shortest Unsorted Continuous Subarray

유승선 ·2024년 1월 15일
0

LeetCode

목록 보기
91/121

오늘도 Array 문제를 풀어보았다. 분명히 쉬워 보이긴 하는데 문제는.. O(n) 으로 풀어봐에서 많이 걸렸다.

무식하게 푸는 방법으로 O(n^2) 방식으로 풀었다면은 가장 Sorting 이 필요한 구간을 알 수 있었겠지만 O(n) 은 다른 방식으로 접근 해야했다.

가장 먼저, 왼쪽과 오른쪽을 기준으로 가장 작고.. 가장 큰 수를 찾아냈다.

이후에는 왼쪽부터 시작해서 가장 작은 수보다 큰 숫자 발견시 시작점으로 생각하고

오른쪽에서 시작해서 가장 큰 수보다 한번이라도 작은 숫자가 나타나면 끝나는 구간으로

이 둘의 차이를 구하면 됐었다. 솔직히 아이디어는 좀 어려운 문제인거같다.

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        int min_ = INT_MAX; 
        int max_ = INT_MIN; 
        bool flag = false; 
        for(int i = 1; i < nums.size(); i++){
            if(nums[i] < nums[i-1]){
                flag = true; 
            }
            if(flag){
                min_ = min(min_, nums[i]); 
            }
        }
        flag = false; 
        for(int i = nums.size()-2; i >= 0; i--){
            if(nums[i] > nums[i + 1]){
                flag = true;
            }
            if(flag){
                max_ = max(max_,nums[i]); 
            }
        }
        cout << min_ << ' ' << max_; 
        int l, r;  
        for(l = 0; l < nums.size(); l++){
            if(min_ < nums[l]){
                break; 
            }
        }

        for(r = nums.size()- 1; r >= 0; r--){
            if(max_ > nums[r]){
                break; 
            }
        }

        return r - 1 < 0 ? 0 : r - l + 1; 

        return max_; 
    }
};
profile
성장하는 사람

0개의 댓글