newCoder在线编程---(1)

二维数组查找

题目描述:

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
1、暴力搜索(简称"暴搜")

public class Solution {
    public boolean Find(int [][] array,int target) {
        for(int i = 0; i < array.length; ++i) {
            for(int j = 0; j < array[i].length; ++j) {
                if(array[i][j] == target) {
                    return true;
                }
            }
        }
        return false;
    }
}

算法分析:

这种方法简单粗暴,初学者往往首先想到。渐进时间复杂度O(n^2),数据量大时搜索效率较低。
2、二分搜索

public class Solution {
    public boolean Find(int [][] array,int target) {
        // 分行二分搜索
        for(int i = 0; i < array.length; ++i) {
            int left = 0;
            int right = array[i].length - 1;
            while(left <= right) {
                int mid = (left + right) >>> 1;
                if(array[i][mid] < target) {
                    left = mid + 1;
                } else if(array[i][mid] > target) {
                    right = mid - 1;
                } else {
                    return true;
                }
            }
        }
        return false;
    }
}

算法分析:

由于二维数组按行、列具有递增(有序),因此可在暴搜算法的基础上使用二分搜索进行优化。此算法的渐进时间复杂度为O(n*log2(n)),显然O(n^n) > O(n*log2(n))。
3、不知道该叫什么算法,反正有点智力题的味道

public class Solution {
    public boolean Find(int [][] array,int target) {
        // 从左下角位置开始搜索(向上减少,向右增加,分岔点)
        int row = array.length - 1;
        int col = 0;

        // 边界检查
        while(row >= 0 && col < array[0].length) {
            if(array[row][col] < target) {
                col ++;
            } else if(array[row][col] > target){
                row --;
            } else {
                return true;
            }
        }
        return false;
    }
}

算法分析:

算法渐进时间复杂度进一步降低,为O(n)。这种算法在处理这道题目时存在缺陷,只能够处理矩阵,而不能够完美兼容不规则二维数组。当然,本题如果从右上角开始搜索也是同理。

算法分析

二分搜索算法(binary search algorithm)代码:

public static boolean binarySearch(int[] arr, int target) {
    int low = 0;
    int high = arr.length - 1;
    while(low <= high) {
        int mid = (low + high) >>> 1;
        if(arr[mid] < target) {
            low = mid + 1;
        } else if(arr[mid] > target) {
            high = mid - 1;
        } else {
            return true;
        }
    }
    return false;
}

二分搜索具体分析:

时间: 2024-10-12 00:44:02

newCoder在线编程---(1)的相关文章

第五届在线编程大赛月赛第一题:完全平方数的个数

第五届在线编程大赛月赛第一题:完全平方数的个数 题目详情: 给定整数区间[A,B]问其中有多少个完全平方数. 输入格式: 多组数据,包含两个正整数A,B 1<=A<=B<=2000000000. 输出格式: 每组数据输出一行包含一个整数,表示闭区间[A,B]中包含的完全平方数的个数. 答题说明: 输入样例 1 1 1 2 3 10 3 3 输出样例: 1 1 2 0 java代码: import java.util.Scanner; public class One { public s

Open XML SDK 在线编程黑客松

2015年2月10日-3月20日,开源社 成员 微软开放技术,GitCafe,极客学院联合举办" Open XML SDK 在线编程黑客松 ",为专注于开发提高生产力的应用及服务的程序猿们提供一个在线动手开发,学习交流,技术分享,发挥创意与竞技的盛宴. 我们为参赛队伍准备了丰富的技术干货,国内外高手无私分享以及技术支持,逐步引导的在线学习视频教程与技术文档,场景范例,在线编程及演示环境,社区互动,丰富礼品(如极客学院特别为每位参赛人员提供月VIP码,用户可以免费学习极客学院全网课程)及

在四川大学的第三个冠军在线编程竞赛:簿传输

好久没有写日志,奇怪的是很特别的更近,最近参加的编程方面是CSDN在学院俱乐部的在线编程插头.说到编程大赛.一共有三个问题.标题都能够csdn学院看到俱乐部.比赛有点紧张时,,第三个问题涉及到队列,提示,坑...也怨自己平时写代码用惯了代码提示,非常多stl的方法都是隐隐约约知道,可是详细的不知道,导致第三题没有做出来,遗憾哈!以下贴一下今天写的第三题的代码 题目 四川大学线下编程比赛第三题:书本转移 题目详情: 小强有 3 个箱子 A,B,C 用来装书,全部的书(一共n本)都按序号由小到大的顺

火车调度-c#求解-英雄会在线编程题目

题目: 火车调度 返回首页 发布公司: 有 效 期: 赛 区: CSDN 2014-04-30至2015-04-30 北京 难 度 等 级: 答 题 时 长: 编程语言要求: 120分钟 C C++ Java C# 题目详情 火车从A地和B地之间运行,你知道火车从某地出发的时间和到达某地的时间(这个时间出发,一定这个时候到达).火车到达目的地后,不能立刻返回,需要经过t分钟检修才可以返回.列车只在A.B两地运行.你知道每天内的时刻表,求A,B两地各需要存放多少辆列车,才能满足这个时刻表?即只要该

另类编辑距离-c#求解-英雄会在线编程题目

Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么做呢? 一. 生成对象的原始模式 假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性. var C

Java中的 Scanner简述(企业笔试在线编程的输入控制)

摘要: 最近进行企业在线笔试时,发现企业的笔试平台大都使用赛码网(虽然槽点很多),而且在线编程都需要使用Scanner来读取程序的输入,因此,笔者就在先辈们的成果上对Scanner做了一份全新的.详细的总结.我们知道,java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都不怎么地,特此简述. 版权声明: 本文原创作者:书呆子Rico 作者博客地址:http

F(X)--c#求解-英雄会在线编程题目

先看题目: F(X) 发布公司: 有 效 期: 赛 区: CSDN 2014-04-16至2015-04-16 北京 难 度 等 级: 答 题 时 长: 编程语言要求: 120分钟 C C++ Java C# 题目详情 我们定义 F(x)是满足 x  mod(a*b) == 0这样的a,b的组数.现在给你一个n,你需要求出 F(n) 输入格式: 多组数据,每组第一行有一个整数n, 0 < n <= 10^11. 输出格式: 每组输出一行,满足条件的(a,b)对数 答题说明 输入样例 1 2 3

在线编程及其学习平台

在线编程(itbegin)是指不需要经过安装编程的环境,直接在互联网浏览器上编写程序,并且可以运行出结果. 在线编程的原理比较复杂,因为其涉及web前端以及后端编译系统.Web前端需要提供用户代码录入,行号.高亮语法.自动补全功能,并需要使用异步更新(Ajax) 的方法来实现上述功能.后端编译系统接收到用户的代码,并调用正确的编译器进行编译并将结果返回前端进行显示. 在线编程网站: 1.codepad:http://codepad.org/ 该网站只支持英文,支持C/C++/D/Haskell,

介绍一个在线编程和编译网站

在线编程网站 http://www.compileonline.com/ 提供了各种语言编译.运行环境,可大大简化客户端程序安装配置的复杂度,实现即时编程的目的; 当然,如果你想用这些机器的计算资源,也是一个好的途径. 支持的语言包括: Ada (Gnat) Algol-68 Assembly Awk Bash Shell Basic Befunge Brainf**k C C99 Strict COBOL C++ C++11 C++0x C# Clojure Dart D Language E