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;
}
二分搜索具体分析:
newCoder在线编程---(1)的更多相关文章
- 算法与数据结构(2)--英雄会第三届在线编程大赛:几个bing
基础知识的回顾不再写到这里面了,会写一些算法算法的解答或者读一些相关书籍的笔记. 今天做了一道算法题,来自微软必应·英雄会第三届在线编程大赛:几个bing? 做出来了...但不知道为啥执行测试用例失败 ...
- csdn在线编程里面的一个排列组合题
是csdn在线编程里面的一个问题 回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写字母组成的字符串,你可以把它的字母重新排列,以形成不同的回文字符串. 输入:非空仅由小写字母组成的字符 ...
- Open XML SDK 在线编程黑客松
2015年2月10日-3月20日,开源社 成员 微软开放技术,GitCafe,极客学院联合举办" Open XML SDK 在线编程黑客松 ",为专注于开发提高生产力的应用及服务的 ...
- [转]微软联合CSDN英雄在线编程大赛
2014 新年将至,微软联合CSDN英雄会共同举办本次第三届在线编程大赛,题目详情如下: 有一个字符串"iinbinbing",截取不同位置的字符‘b’.‘i’.‘n’.‘g’组合 ...
- 网易云课堂_C++程序设计入门(上)_第6单元:丹枫虽老犹多态–继承与多态_第6单元作业【2】- 在线编程(难度:中)
第6单元作业[2]- 在线编程(难度:中) 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统 ...
- 网易云课堂_C++程序设计入门(上)_第5单元:万类霜天竞自由 – 对象和类的更多内容_第5单元作业【4】 - 在线编程(难度:难)
第5单元作业[4] - 在线编程(难度:难) 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系 ...
- [ios-必看] 国人当自强:两岸三地在线编程学习网站大搜罗 [转]
http://blog.csdn.net/lyy_whg/article/details/17350923 说到国内的在线编程学习网站,很多人都是一脸茫然,即使是资深开发者也是如此.在许多人眼中,尽管 ...
- Python在线编程环境
除了安装Python的IDE之外,也可以使用在网页中随时随地编写Python程序. Python官网:https://www.python.org/shell Python123:https://py ...
- 网易云课堂_C++程序设计入门(下)_期末考试_期末考试在线编程题目
期末考试在线编程题目 返回考试 本次考试题目一共两个,在考试期间可以不限制次数地提交 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间 ...
随机推荐
- 手写一个admin 组件------STARK
开一个新的项目,,建立一个stark 包, 在里面创建一个service包,在service 包里创建一个stark.py 文件, 配置好环境, makemigreations, migreate. ...
- URAL 1297 Palindrome (后缀数组+RMQ)
题意:给定一个字符串,求一个最长的回回文子串,多解输出第一个. 析:把字符串翻转然后放到后面去,中间用另一个字符隔开,然后枚举每一个回文串的的位置,对第 i 个位置,那么对应着第二个串的最长公共前缀, ...
- hdu1061
#include <iostream>#include <cstdio>using namespace std;int mod_exp(int a, int b, int c) ...
- Spark Task 概述
Task的执行流程: 1. Driver端中的 CoarseGrainSchedulerBackend 给 CoarseGrainExecutorBacken 发送 LaunchTask 消息 2. ...
- bzoj 3123: [Sdoi2013]森林(45分暴力)
3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4184 Solved: 1235[Submit][Status ...
- java 定位问题方法 (jdb 和 jstack)
使用java 做开发,大部分的朋友都是利用DIE 来做debug 工作,因为这样可视化效果好. 但是在真实的工作中,很多使用遇到问题,手头或者环境是不允许你利用DIE 来对源码做debug 工作,开发 ...
- 最全 MySQL 优化方法,从此优化不再难
说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原 ...
- 位运算实现四则运算(C++实现)
前言 Leetcode中有一道这样的题:给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符.返回被除数 dividend 除以除数 di ...
- Angular学习笔记【ngx-bootstrap】中的 tabset
<tabset class="tab-container tabbable-line"> <tab heading="{{l("MobileS ...
- poj1082 Calendar Game (博弈)
题意是:Adam和Eve两人做游戏,开始给出一个日期,截止日期是2011.11.4,游戏规则如下: 每个人只能将天数增加一天或者将月份增加一天.如果下个月没有这一天,那么只能增加天数. 游戏胜利定义为 ...