Post

leetcode(리트코드)33-Serach in Rotated Sorted Array

leetcode 33 - Search in Rotated Sorted Array 문제입니다.

1. 문제

https://leetcode.com/problems/search-in-rotated-sorted-array/


2. Input , Output


3. 분류 및 난이도

Medium 난이도 문제입니다.
leetcode Top 100 Liked 문제입니다.


4. 문제 해석

  • 문제 해석이 까다로웠습니다.
  • 이미 정렬된 오름차순 벡터가 있다고 가정하고 어느 한 인덱스를 지점으로 뒤집어 버린것이 ‘nums’ 벡터입니다. 그렇기에 [4,5,6,7,0,1,2]는 인덱스 [0,1,2,4,5,6,7]에서 인덱스 3을 기준으로 뒤집은 벡테입니다.
  • 해당 벡터에서 target으로 주어진 값을 찾습니다. 있으면 해당index를 반환하고 없으면 -1을 반환합니다.

  • 풀이과정은 맨끝 의 인덱스는 앞으로 갈수록 작아질 일만 남았고, 0번째 인덱스에서 어느 지점까지는 증가할 일만 남았으니 들어온 값이 0번째 인덱스를 기준으로 작으면 뒤에서부터 검사하고 아니면 순차접근 합니다. 최악의경우 n이겠지만..

5. code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public:
    int search(vector<int>& nums, int target) {
        if(nums.size()==1)
            return nums[0]==target ? 0 : -1;
        
        
        int start =0;
        int end = nums.size()-1;
        int max = nums[end];
        //끝에서부터 탐색(끝이 가까울 수록)
        if(target<=nums[end])
        {
            while(end>start && nums[end]>target)
            {
                cout<<end<<'\n';
                --end;
            }
            if(nums[end]==target)
                return end;
            else
                return -1;
        }
        else
        {
            while(start<end &&nums[start]<target)
            {
                ++start;
            }
            if(nums[start]==target)
                return start;
            else
                return -1;
        }
        
        return -1;
    }
};

python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        if len(nums) == 1 : return -1 if nums[0] != target else 0
        #binary search
        left = 0
        right = len(nums)-1
        if nums[right] == target :
            return right
        
        if nums[right] > target :
            while right-1 >=0 and nums[right] >nums[right-1] : 
                if nums[right-1] == target : 
                    return right-1
                right-=1
        else : 
            if nums[left] == target : 
                return left
            while left+1 < len(nums) and nums[left] < nums[left+1] : 
                if nums[left+1] == target : 
                    return left+1
                left+=1
                    
        return -1

6. 결과 및 후기, 개선점

This post is licensed under CC BY 4.0 by the author.