剑指offer——02二维数组中的查找】的更多相关文章

题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.   注意: 数组不一定是这样的: 1 2 3 4 5 6 7 8 9   而是这样的: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15   一下给出两种方法: 笨方法: 从数组左上角开始查找,若target比自己大且比右边的数小,或者比最右边列的数大,则应向下查找, 但…
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解题思路 这题解题的关键在于数据是有序的,很自然的便想到使用二分法:在提交后在评论区发现了更优的解法(除了数据有序外,利用了数据按矩阵形式排列这一特点),会在下列代码中给出. 在使用二分法时,值得注意的是,不能将二…
剑指 Offer 04. 二维数组中的查找 题目链接 本题的解法是从矩阵的右上角开始寻找目标值. 根据矩阵的元素分布特性, 当目标值大于当前位置的值时将row行号++,因为此时目标值一定位于当前行的下面. 当目标值小于当前位置的值时将col列号--,因为此时目标值一定位于当前列的前面. 最后需要注意的一点就是退出while循环的条件(行号大于行数,列号小于0). package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 20…
本题目是<剑指offer>中的题目 二维数组中的查找 题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路: step1:首先取数组中右上角的数字 step2:判断如果等于目标值,则查找过程结束 step3:如果该数字大于目标值,剔除这个数字所在的列 step4:如果该数字小于目标值,剔除这个数在所在的行 C++ code class Sol…
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路 查找整数时,如果从左上角开始查找,情况较为复杂,可以转换思路,从右上角开始查找:左边数字比较小,右边数字比较大,容易进行判断. 测试用例 1.要查找的数字在数组中 2.要查找的数字不在数组中 3.数组为空…
题目 在一个二维数组中,每一行都依照从左到右递增的顺序排序,每一列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个二维数组和一个整数.推断数组中是否含有该整数. 思路 [算法系列之三十三]杨氏矩阵 代码 /*--------------------------------------- * 日期:2015-07-19 * 作者:SJF0115 * 题目: 5.二维数组中的查找 * 网址:http://www.nowcoder.com/books/coding-interviews/ab…
剑指Offer  第一题 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.     本人简单的解题思路  就是通过二重循环,遍历.查找数组中是否有目标数字,思路是简单的,但是有个小坑 ,就是没有进行数组越界判断   少判断了  array = [ [ ] ] 这种情况,最终通过的代码为 public class Solution { publi…
该题目来源于牛客网<剑指offer>专题. 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. Go语言实现: func searchMatrix(matrix [][]int, target int) bool { if matrix == nil || len(matrix[0]) < 1 { return false } row := 0 c…
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.   注意点:要注意特殊情况的存在,比如数组为null,数组的长度为0等情况. public class Solution { public boolean Find(int target, int [][] array) { boolean result = false; if(array == null || arra…
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目地址 https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&tPage=1&rp=2&ru=%2Fta%2Fcoding-interviews&…
题目: 在一个二维数组中.每一行都依照从左到右递增的顺序排序,每一列都依照从上往下递增的顺序排序.请写一个函数,输入一个二维数组和一个整数,推断数组中是否含有该整数. 比如以下的二维数组就是每行.每列都是递增顺序,假设在这个数组中查找数字7.则返回true.假设查找数字5,因为数组中不含有该数字.则返回false. 1   2   8   9 2  4   9   12 4  7  10   13 6  8   11   15 public class FindFromMatrix { priv…
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.     自己的思路实在是傻×了,先看下正确思路吧   把当前数字定位在第一行,最后一列.如果数字小则增大行,如果数字大则减小列!O(M+N) bool Find3(vector<vector<int> > array,int target) { ].empty()) return false; , c =…
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:本题中的二维数组从左到右,从上到下依次递增,即每一行的最后一个数字为最大,每一列的最下数字为最大. 在查找过程中总共分为两种情况: 1.查找数字小于比较数字,说明查找数字在比较数字的左边 2.查找数字大于比较数字,说明查找数字在比较数字的下边 以查找7为例: 代码: import timecl…
一.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 二.输入描述 array: 待查找的二维数组 target:查找的数字 三.输出描述 查找到返回true,查找不到返回false 四.牛客网提供的类框架 class Solution { public: bool Find(vector<vector<int> > array,int target) {…
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解法一 利用二位数组有序的特性,首先选取数组中右上角的数字.如果该数字等于要查找的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行.也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每…
链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/ 标签:数组.双指针.二分 题目 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6…
注意是有序数组!! 思路: 1.利用二维数组由上到下,由左到右递增的规律,选取右上角或者左下角的元素a[m][n]与target进行比较, 当target小于元素a[m][n]时,那么target必定在元素a所在行的左边,即n-1: 当target大于元素a[m][n]时,那么target必定在元素a所在列的下边,即m+1: # -*- coding:utf-8 -*- class Solution: # array 二维列表 def Find(self, target, array): # w…
二维数组查找:线性查找法 有二维数组: [  [1,   4,  7, 11, 15],  [2,   5,  8, 12, 19],  [3,   6,  9, 16, 22],  [10, 13, 14, 17, 24],  [18, 21, 23, 26, 30]]应该从位置最后一行第一个数字(18)出发 如果该位置比目标大,代表该行剩下部分没有目标,则寻找上一行 如果该位置比目标小,代表该列之前部分没有目标,则寻找下一列 (换言之,目标一定在一个所有值都不大于目标的区域的边界处) 例:寻…
题目: 数组中唯一只出现一次的数字.在一个数组中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 题解: 如果一个数字出现三次,那么它的二进制表示的每一位(0或者1)也出现三次.如果把所有出现三次的数字的二进制表示的每一位都分别加起来,那么每一位的和都能被3整除.我们把数组中所有数字的二进制表示的每一位都加起来.如果某一位的和能被3整除,那么那个只出现一次的数字二进制表示中对应的那一位是0:否则就是1. class Solution { public: int fin…
题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.斐波那契数列的定义如下: 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=70). 输出: 对应每个测试案例, 输出第n项斐波那契数列的值. 样例输入: 3 样例输出: 2 解题思路: 题目中可以看到,n的范围是70,最先想到的递归肯定是不行的,那么我们钻一个空子,事先生成一个数组,到时候取出来就可以了.太高端的想法,也想不出,记得有一个用矩阵求解的方法,很快.这道题…
题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1].不能使用除法.   题解: 将每一行分为两半部分,0,1,2....i-1    与   i+1.....n-1这两部分 利用下图所示的矩阵,左半部分从上向下,利用上一行答案求解,右半部分从下至上求解,利用下一行答案求解. class Solution { public: vector<int> m…
//实现一个函数,将一个字符串的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. public class Solution { public String replaceSpace(StringBuffer str) { String s = str.toString(); char[] s_1 = s.toCharArray(); StringBuffer out = new StringBuffer(); for…
题目:http://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e C++ class Solution { public: bool Find(vector<vector<int> > array,int target) { int rows = array.size(); ].size(); ; ; && y < rows ) { if (array[x][y] == target) r…
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成这样一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 例如: 1    2    8     9 2    4    9    12 4    7   10   13 6    8    11  15 查找7返回True,查找5返回False --- - -- - -- - -- - -- - -- - -- - --- - -- - -- - -- - -- - -- -…
题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 2 4 9 12 4 7 10 13 6 8 11 15 在做这道题的时候我最先考虑的是每次比较对角线上的元素可能可以取得较好的效果, 以查找9为例, 从1(0,0)开始,1<10,可以得出结论,10在1的右侧或下侧: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 然后看4(1,1),4<9, 1 2 8 9 2 4…
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路: 解法一 每一行递增,每一列也递增,于是从二维数组的右上角开始比较,每次都比较这一行最大的,如果target比这一行最大的还大,那这一行肯定没有目标值,直接跳入下一行.如果比这一行最大的小,则这一列肯定没有目标值.每一次比较都砍掉一行或一列.复杂度o(m+n) class Solution…
*题目描述* **在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.** 时间限制:1秒 空间限制:32768K **本题知识点: 查找 数组** 来源:牛客 讲解:剑指offer P44 public class Solution { public boolean Find(int target, int [][] array) { boolean fo…
准备找实习期间,复习一下数据相关内容,刷刷题. 题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解题思路: 思路一:由于数组有序,一开始直接想每一行分别用二分来做,结果超时,分析下来这样做的复杂度是O(nlogn). 思路二:换个角度,同样是二分,但是考虑到右上角的数是当前行的最大值,是当前列的最小值,处于一个中间状态.所以每次选择右上角元…
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. def Find(self, target, array): # write code here row = len(array)-1 col = 0 while row >= 0 and col <= len(array[0])-1: # 从左下角判断,如果比左下角元素小,则行-1:若比左下角元素大,则列+1 if array…
剑指Offer之二维数组中查找目标数 题目描述 ​ 在一个二维数组中(每个一维数组的长度相等),每一行都是从左到右递增的顺序排序,每一列都是从上到下递增的顺序排序,输入这样一个二维数组和一个整数,判断该整数是否在二维数组中. 解题思路及代码 // 暴力查找法,通过遍历整个二维数组进行判断 public static boolean violence(int[][] arr,int target) { for (int i = 0; i < arr.length; i++) { for (int…