hyelie
hyelie
Hyeil Jeong
       
글쓰기    관리    수식입력
  • 전체보기 (495)
    • PS (283)
      • Algorithm (28)
      • PS Log (244)
      • Contest (6)
      • Tips (5)
    • Development (52)
      • Java (14)
      • Spring (23)
      • SQL (2)
      • Node.js (2)
      • Socket.io (3)
      • Study (4)
      • Utils (4)
    • DevOps (36)
      • Git (5)
      • Docker (4)
      • Kubernetes (2)
      • GCP (3)
      • Environment Set Up (8)
      • Tutorial (12)
      • Figma (2)
    • CS (74)
      • OOP (7)
      • OS (24)
      • DB (2)
      • Network (24)
      • Architecture (0)
      • Security (2)
      • Software Design (0)
      • Parallel Computing (15)
    • Project (15)
      • Project N2T (5)
      • Project ASG (0)
      • Project Meerkat (1)
      • Model Checking (7)
      • Ideas (2)
    • 내가 하고싶은 것! (34)
      • Plan (16)
      • Software Maestro (10)
      • 취준 (8)
hELLO · Designed By 정상우.
hyelie

hyelie

PS/PS Log

23.08.07. 풀었던 문제들 복기

Leetcode 74. Search a 2D Matrix, 25분

 matrix가 정렬되어 있으므로 target이 있는 row를 찾고, 이후 col을 찾으면 된다.

 row를 찾을 때 binary search를 하고, col을 찾을 때 binary search를 하면 O(logm + logn)으로 해결할 수 있다.

 

 이외에도, 모범답안은 전체를 하나의 array로 보고, index / m을 row index, index / n을 col index로 보고 O(log(m*n))만에 해결하는 방법도 있다.

// Runtime 3 ms Beats 82.89%
// Memory 9.6 MB Beats 19.73%

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size(), n = matrix[0].size();

        // lower bound로 찾는 식으로 -> matrix[i][0]으로 찾으면 upper bound로 찾고 -1 해야 한다. 귀찮다!
        // 따라서 matrix[i][n-1]로 찾는다. target이 들어 있을 만한 행을 찾기 위해서이다.
        int start = 0, end = m, mid;
        while(start < end){
            mid = (start + end)/2;
            if(matrix[mid][n-1] >= target) end = mid; // 앞으로 당겨야 함
            else start = mid + 1;
        }
        if(end == m || (end == 0 && matrix[0][0] > target)) return false;
        int i = start;
        
        // col 찾기
        start = 0; end = n;
        while(start < end){
            mid = (start + end)/2;
            if(matrix[i][mid] >= target) end = mid; // 앞으로 당겨야 함
            else start = mid + 1;
        }
        if(end == n || matrix[i][end] != target) return false;

        return true;
    }

};

/*
binary search 2번?
*/

 

시간복잡도

 row size를 m, col size를 n이라 하면  O(logm + logn)

 

 

 

 

 

저작자표시 (새창열림)

'PS > PS Log' 카테고리의 다른 글

23.08.09. 풀었던 문제들 복기  (0) 2023.08.09
23.08.08. 풀었던 문제들 복기  (1) 2023.08.09
23.08.05. 풀었던 문제들 복기  (0) 2023.08.05
23.08.04. 풀었던 문제들 복기  (0) 2023.08.05
23.08.02. 풀었던 문제들 복기  (0) 2023.08.02
    hyelie
    hyelie

    티스토리툴바