题解 | #二维数组中的查找#

二维数组中的查找

https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e

class Solution {
public:

    // 看题意似乎是正方形 no  可能是矩形 而且可能有重复元素!
    /**
     * 二分搜索 基本函数
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int binary_search(vector<int>& nums, int target) {
        // write code here

        int n = nums.size();
        int l = 0, r = n-1;
        int ans = -1;
        while (l<=r) // 终止条件注意!
        {
            int m = l+0.5*(r-l); //  0.5*(r+l) 注意这两个取中值都可以 不要混淆就行!

            if(nums[m]>target)
            {
                r = m - 1;
            }
            else if(nums[m]<target)
            {
                l = m+1;
            
            }
            else // 一定得保留此支路!
            {
                ans = m;
                break;
            }
        
        }

        return ans>=0 ? ans : -1;
    }

    // 双二分查找 递归 !
    bool double_binary(vector<vector<int> >& nums, int target, int xl, int yl, int xr, int yr) {
        // 搜索范围由 (xl, yl) (xr, yr) 分别为左上 和 右下圈出的矩形
        if(xl>xr || yl>yr) // 类比二分搜索的终止条件
            return false;
        
        int xm = 0.5*(xr+xl);
        int ym = 0.5*(yr+yl);

        if(nums[xm][ym]==target)
            return true;
        
        if(nums[xm][ym]>target) // 分块 但注意各块不再规则 而且分块方式有两种
        {
            if(double_binary(nums, target, xl, yl, xm-1, yr ))
                return true;
            if(double_binary(nums, target, xm, yl, xr, ym-1))
                return true;
        }
        else
        {
            if(double_binary(nums, target, xm+1, yl, xr, yr ))
                return true;
            if(double_binary(nums, target, xl, ym+1, xm, yr))
                return true;
        }
        
        return false; //别忘了
    }

    // 解法四 递归 二分搜索 利用每一行/列 递增的性质  O(logm logn) !
    bool Find(int target, vector<vector<int> > array) {

        int m = array.size(), n = array[0].size();

        bool ans  = double_binary(array, target, 0, 0, m-1, n-1);
        
        return ans;
    } 
};

全部评论

相关推荐

2025-12-12 15:19
首先说明一下我眼中互联网大厂的定义:扎根互联网+对互联网影响重大T0:BAT(无先后)字节:如今&nbsp;TT&nbsp;已经成为全球最火的软件,直播电商创造的价值无法估计。对于&nbsp;AI&nbsp;技术,字节更是成立了&nbsp;seed&nbsp;部门,应用上有豆包,学术上有论文。阿里:业务就不多介绍,AI技术上和字节类似,通义实验室的&nbsp;AI&nbsp;也在国际上有一席之地。腾讯:更不用介绍,有鹅选鹅似乎永远不会过时。T1:蚂蚁蚂蚁:实际上,蚂蚁的认可度可以达到&nbsp;T0(当阿里用一点问题没有),熟悉商业史的同学都知道,蚂蚁没改名前叫做&quot;浙江阿里巴巴&quot;,除了这层关系,蚂蚁本身的业务、技术都配得上T0&nbsp;的宝座,把它排在&nbsp;T1&nbsp;主要还是&nbsp;bat&nbsp;的业务太广泛(且名义上不属于阿里巴巴)。T1.5:美团美团:个人感觉实力能够排在蚂蚁之后,但是认可度似乎还没那么高。即时零售已经成为电商领域的必争之地,美团作为霸主有非常多的优势。同时技术上,也是公认的很好,AI&nbsp;目前没有特别多的成果。T2:京东、pdd、滴滴、shopee、百度、shein、快手、TME、小红书等等,能够排在&nbsp;T2&nbsp;的定义:三个&nbsp;T2&nbsp;可以合成一个&nbsp;T0,这个层次的大厂认可度其实没有太大区别了,社招简历都能过筛。(TME&nbsp;的认可度也可以当腾讯用,但是&nbsp;TME&nbsp;本身实力不像蚂蚁,所以只能在&nbsp;T2)对于美团:我认为美团比&nbsp;T2&nbsp;其他大厂强很多,但是又比&nbsp;T1、T0&nbsp;的大厂逊色不少,就单独为&nbsp;T1.5&nbsp;了。中厂定义:不属于&nbsp;T2&nbsp;的互联网大公司,例如&nbsp;soul、陌陌、知乎、科大讯飞这种,他们有知名度,但是认可度差了&nbsp;T2&nbsp;一个档次,也没办法“三合一成为T0”
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务