二维数组查找

题目描述:

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
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;
}

二分搜索具体分析:

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

  1. 算法与数据结构(2)--英雄会第三届在线编程大赛:几个bing

    基础知识的回顾不再写到这里面了,会写一些算法算法的解答或者读一些相关书籍的笔记. 今天做了一道算法题,来自微软必应·英雄会第三届在线编程大赛:几个bing? 做出来了...但不知道为啥执行测试用例失败 ...

  2. csdn在线编程里面的一个排列组合题

    是csdn在线编程里面的一个问题 回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写字母组成的字符串,你可以把它的字母重新排列,以形成不同的回文字符串. 输入:非空仅由小写字母组成的字符 ...

  3. Open XML SDK 在线编程黑客松

    2015年2月10日-3月20日,开源社 成员 微软开放技术,GitCafe,极客学院联合举办" Open XML SDK 在线编程黑客松 ",为专注于开发提高生产力的应用及服务的 ...

  4. [转]微软联合CSDN英雄在线编程大赛

    2014 新年将至,微软联合CSDN英雄会共同举办本次第三届在线编程大赛,题目详情如下: 有一个字符串"iinbinbing",截取不同位置的字符‘b’.‘i’.‘n’.‘g’组合 ...

  5. 网易云课堂_C++程序设计入门(上)_第6单元:丹枫虽老犹多态–继承与多态_第6单元作业【2】- 在线编程(难度:中)

    第6单元作业[2]- 在线编程(难度:中) 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统 ...

  6. 网易云课堂_C++程序设计入门(上)_第5单元:万类霜天竞自由 – 对象和类的更多内容_第5单元作业【4】 - 在线编程(难度:难)

    第5单元作业[4] - 在线编程(难度:难) 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系 ...

  7. [ios-必看] 国人当自强:两岸三地在线编程学习网站大搜罗 [转]

    http://blog.csdn.net/lyy_whg/article/details/17350923 说到国内的在线编程学习网站,很多人都是一脸茫然,即使是资深开发者也是如此.在许多人眼中,尽管 ...

  8. Python在线编程环境

    除了安装Python的IDE之外,也可以使用在网页中随时随地编写Python程序. Python官网:https://www.python.org/shell Python123:https://py ...

  9. 网易云课堂_C++程序设计入门(下)_期末考试_期末考试在线编程题目

    期末考试在线编程题目 返回考试   本次考试题目一共两个,在考试期间可以不限制次数地提交 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间 ...

随机推荐

  1. NIO和Reactor

    本文参考Doug Lea的Scalable IO in Java. 网络服务 随着网络服务的越来越多,我们对网络服务的性能有了更高的要求,提供一个高性能,稳定的web服务是一件很麻烦的事情,所以有了n ...

  2. es6基础系列三:解构赋值

    解构就是ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值(只能用于数组,对象或迭代器).如果解构不成功,则等于undefined,但不能赋值为undefined和null,因为undefi ...

  3. 配置OpenCV报应用程序无法正常启动0xc000007b

    我的配置软件是OpenCV3.4.1和visual studio2017.参考这篇博客(https://blog.csdn.net/qq_41175905/article/details/805604 ...

  4. html的Vue.js框架概述

    前端的三大框架: Augular.js          由Google的研发团队最先写出 React.js            由facebook的团队继Augular.js之后写出 Vue.js ...

  5. PHPExcel探索之旅---阶段四 导入文件

    步骤就是:实例化excel读取对象=> 加载excel文件 => 读取excel文件(全部读取.逐行读取) <?php header("Content Type :text ...

  6. 什么是SG?+SG模板

    先,定义一下 状态Position P 先手必败 N x先手必胜 操作方法: 反向转移 相同状态 不同位置 的一对 相当于无 对于ICG游戏,我们可以将游戏中每一个可能发生的局面表示为一个点.并且若存 ...

  7. BigDecimal默认用四舍五入方式

    import java.math.BigDecimal; target.setWeight(source.getWeight().setScale(3, BigDecimal.ROUND_HALF_U ...

  8. 【ACM】大数阶乘 - Java BigInteger实现

    大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?   输入 输入一个整数 ...

  9. @async 方法上添加该注解实现异步调用的原理

    在我们使用spring框架的过程中,在很多时候我们会使用@async注解来异步执行某一些方法,提高系统的执行效率.今天我们来探讨下 spring 是如何完成这个功能的. spring 在扫描bean的 ...

  10. strcpy、strncpy、strlen、memcpy、memset、strcat、strncat、strcmp、strncmp,strchr

    1.strcpy #include<stdio.h> #include<assert.h> char *mystrcpy(char *dest, const char *src ...