不确定时间复杂度

时间:2021-05-01 21:48:58

标签: c++ time time-complexity divide-and-conquer

所以我正在做一个关于 LeetCode 的问题...... 问题:

Write an efficient algorithm that searches for a target value in an m x n integer matrix. The matrix has the following properties:

Integers in each row are sorted in ascending from left to right.
Integers in each column are sorted in ascending from top to bottom.
 
Example 1:
Input: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
Output: true

Example 2:
Input: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
Output: false

所以首先我通过常规蛮力方法尝试了这个问题: 答案 1:

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int t) {
        int i=0,j,I=matrix.size(),J,mj;
        for(;i<I;i++)
        {
            j=0;J=matrix[i].size()-1;
            mj=(j+J)/2;
            while(j<=J)
            {
                if(matrix[i][mj]==t)
                    return true;
                else if(matrix[i][mj]<t)
                    j=mj+1;
                else
                    J=mj-1;
                mj=(j+J)/2;
            }
        }
        return false;
    }
};

然后我决定通过 idk Divide and Conquer ig... 答案 2:

class Solution {
public:
    
    bool VFinder(vector<vector<int>>& matrix, int hstart, int hend, int vstart, int vend, int ele)
    {
        if(vstart > vend || hstart > hend)
            return false;
        
        int mid = vstart;
        int start = vstart;
        int end = vend;
        while(start<=end)
        {
            mid = (int)((start + end) / 2);
            if (start == end)
         {
            if (matrix[mid][hstart] == ele)
            {
               return true;
            }
            else
            {
               return HFinder(matrix, hstart + 1, hend, vstart, mid, ele);
            }
         }
            else
            {if(matrix[mid][hstart] <ele && matrix[mid+1][hstart] > ele)
                return HFinder(matrix, hstart+1, hend, vstart, mid,ele);
            else if(matrix[mid][hstart] <ele)
                start = mid+1;
            else if(matrix[mid][hstart] >ele)
                end = mid-1;
            else if(matrix[mid][hstart] == ele)
                return true;}
        }
        return false;
    }
    
    bool HFinder(vector<vector<int>>& matrix, int hstart, int hend, int vstart, int vend, int ele)
    {
        if(hstart > hend || vstart > vend)
            return false;
        
        int mid = hstart;
        int start = hstart;
        int end = hend;
        while(start<=end)
        {
            mid = (int)((start + end) / 2);
            if (start == end)
         {
            if (matrix[vstart][mid] == ele)
            {
               return true;
            }
            else
            {
               return VFinder(matrix, hstart, mid, vstart + 1, vend, ele);
            }
         }
            else
            {if(matrix[vstart][mid] <ele && matrix[vstart][mid+1] > ele)
                return VFinder(matrix, hstart, mid, vstart+1, vend, ele);
            else if(matrix[vstart][mid] <ele)
                start = mid+1;
            else if(matrix[vstart][mid] >ele)
                end = mid-1;
            else if(matrix[vstart][mid] == ele)
                return true;}
        }
        return false;
    }
    
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int horizontal = matrix[0].size();
        int vertical = matrix.size();
        return HFinder(matrix, 0, horizontal-1, 0, vertical-1, target);
    }
};

所以提交后的第一个代码大约需要:328 ms 第二个大约是:488 ms

但是在第二个中,我在每一步之后都减少了搜索空间,因此与第一个代码相比,它应该花费更少的时间,但事实并非如此。 有人可以告诉我为什么会这样吗? 还有第二个代码的时间复杂度是多少?

0 个答案:

没有答案
相关问题