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

二维数组中的查找

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;
    } 
};

全部评论

相关推荐

05-22 09:23
门头沟学院 Java
点赞 评论 收藏
分享
来个厂收我吧:首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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