题目1384:二维数组中的查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7318 解决:1418 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.   输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=…
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都是按照从上到下递增的顺序排序.请设计一个函数,输入这样的一个二维数组和一个整数,判断数组是否含有这个整数. 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 我们可以发现以下规律:首先选取数组右上角的数字.如果这个数字是要寻找的数字,则返回结果.若这个数字大于我们要寻找的数字,则去除这个数字所在的列:若这个数字小于我们要寻找的数字,则去除这个数字所在的行.也就是说如果查找的数字不在数组的右上角,则每一次都在数组…
剑指Offer - 九度1384 - 二维数组中的查找2013-11-23 23:23 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数…
在经历了春招各大公司的笔试题和面试官的血虐之后,决定要刷一些算法题了,不然连面试机会都没有. 而应对笔试和面试,比较出名的就是剑指offer的题目和LeetCode的题目了.剑指offer应对面试中的手撕代码,leetcode主要应对线上笔试.本文的剑指offer题目是在牛客网做的,一共有66题,我是按默认的顺序往下做的.牛客网直达链接:https://www.nowcoder.com/activity/oj 题目:二维数组中的查找 考点:数组 描述:在一个二维数组中(每个一维数组的长度相同),…
面试题4:二维数组中的查找 题目要求: 一个二维数组中,每一行从左到右递增,每一列从上到下递增.输入一个整数,判断数组中是否含有该整数 /** * @since 2019年2月13日 下午5:08:50 * @author xuchao * 二维数组,从左到右递增,从上到下递增,输入一个整数,判断数组中是否含有 * * 思路: * 从最后一行第一列与目标值比较,若大于目标值,则行下标-1;若小于目标值,则列下标+1 * */ public class P4_FindInPartiallySort…
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 测试用例: 二维数组中包含查找的数字(查找的数字是数组中的最大值和最小值:查找的数字介于数组中的最大值和最小值之间). 二维数组中没有查找的数字(查找的数字大于数组中的最大值:查找的数字小于数组中的最小值:查找的数字在数组的最大值和最小值之间但数组中没有这个数字). 特殊输入测试(输入空指针). 测试代码: /* ***数字…
剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.     解析: 1.有了行和列,我们就得在数组中选取一个数去array[ i][ j]和target比较大小,在这里我选取的是右上角的数去和target比较 a)如果array[ i][ j] > target 则向左走 即…
  题目描述:   在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.   解题思路:   很明显,由于该二维数组上到下递增,左到右递增的特殊性,遍历整个矩阵进行查找不是该题目的意图所在.总结规律我们可以发现:应该从矩阵的右上角或者左下角开始查找.   以右上角为例,首先选取右上角的数字,如果该数字等于要查找的数字,则查找过程结束:如果该数字大于要查找的数…
题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 思路: 首先选取数组中右上角的数,然后让该数(num1)和待查找的数(num2)进行比较,如果num1比num2小,那么接下来只能向下继续查找,行数加1,如果num1比num2大,那么接下来应该将列数减1,继续查找,直到整个数组遍历完成 代码: public boolean findNum(int[][] arr,int n…
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题解一:二分查找 /** 把每一行看成有序递增的数组, 利用二分查找,通过遍历每一行得到答案 时间复杂度是nlogn */ public static boolean Find(int target, int [][] array) { for(int i=0;i<array.length;i+…
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.…
打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣…
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.…
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解析: 特点:横坐标递增有序,纵坐标递增有序方法1:横坐标二分查找,纵坐标二分查找:方法2:假设矩阵从左下角增长,则有规律:矩阵左上角的元素,递减向下,递增向右.则:从左上角元素比较,小于target则向下移动,大于target则向右移动: 代码: public class Solution {…
二维数组中的查找 热度指数:24274 时间限制:1秒 空间限制:32768K 本题知识点: 查找 ​ 在线提交网址: http://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&rp=1 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数,如果不能找到就输出…
限制今天起开始也刷剑指offer啦,一步一步来. 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目分析 题目不难,而且给出的限制也很小,我一开始试试用了暴力逐步循环发现也能通过,但是这题目设计的初衷不是简单的让你用暴力循环查找出来,而是要注意是有顺序的.所以我们查找的起始点最好从二维数组中的中间的点开始,不过为了方便,我们一般都是选择最左下角的那个点作为起始点,也…
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. class Solution { public: bool Find(vector<vector<int> > array, int target) { int col = array.size(); ; while (i < col) { ;//考虑边界条件 ) continue; if (target…
题目描述 思路分析 Java代码 代码链接 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路分析 由于给定的二位数组是从左到右递增,从上到下递增,所以可以选择二维数组中的某一个边角(右上角或者左下角)开始进行搜索和筛选,比如:从右上角开始,如果目标数字大于右上角的数字(由于从左到右递增),说明要查找的数字在第一行的下面 ,那么第一行的数字可以排除掉,继续以这种方式…
题目:在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的.请找出数组中任意一个重复的数字,但是不能修改输入的数组.例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者3. 方法1:利用辅助函数,逐一把原数组的每个数字复制到辅助数组.如果原数组中被复制的数字是m,则把它复制到辅助数组中下标为m的位置.如果下标为m的位置上已经有数字了,则说明该数字重复了.由于使用了辅助空间,故该方案的空间复杂度是O(n) public…
题目链接:https://www.nowcoder.com/questionTerminal/abc3fe2ce8e146608e868a70efebf62e 题目大意: 略 分析: 对萌醒很开拓思维的一道题,从左下角开始找. 代码如下: class Solution { public: bool Find(int target, vector<vector<int> > array) { ].size(); , j = ; && j < m) { if(ar…
题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路: 1.顺序扫描 顺序扫描整个数组,每扫描到一个数字,就将该数字跟后面的数字比较,如果大于的话,则这两个数字构成了逆序对.(比较简单,这里就不贴出代码) 时间复杂度:O(n^2) 2.归并思想 将数组不断地等分为两个子数组,然后自下而上地统计两个子数组各自的逆序对以及合并后的逆序对. 假设两个子数组左右分别为A,B,长度分为lenA,lenB,子数组已排好序,…
题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 思路: 1.方法1: 先排序,然后找中位数; 时间复杂度O(nlogn) 2.方法2: 基于Partition函数的O(n)算法,即寻找第k(k=n/2)大的数: 平均时间复杂度:O(n) 3.方法3: 根据数组特点,采用Moore-Vote方法. 由于该数字的出现次数比所有其他数字出现次数的和还…
题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 因为只有两个只出现一次的数字,所以所有数字进行异或之后得到值res一定不是0.这样,res中其中至少1bit不是0,我们根据这个bit是否为0把数组分为两组,两个只出现一次的数字肯定在不同的组.其他出现两次的数组两个肯定在相同组,而两个相同的数组异或之后是0,任意一个数字与0异或还是该数字本身. 代码: class Solution { public: void FindNumsAppe…
题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路: 归并排序的合并过程.主要是考虑合并两个有序序列时,计算逆序对数. 对于两个升序序列,设置两个下标:两个有序序列的末尾.每次比较两个末尾值,如果前末尾大于后末尾值,则有”后序列当前长度“个逆序对:否则不构成逆序对.然后把较大值拷贝到辅助数组的末尾,即最终要将两个有序序列合并到辅助数组并有序. 这样,每次在合并前,先递归地处理左半段.右半段,则左.右半段有序,…
题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 思路: 保存两个值:一个数组中的数字.一个出现的次数 如果当前值和保存的数字相同,则次数加1:如果不同,则次数减1:当次数为0时,保存当前数字.置次数为1. 代码: class Solution { public: int MoreThanHalfNum_Solution(vector<int>…
题目: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 思路: 1.排序 将数组排序,然后扫描排序后的数组即可. 时间复杂度:O(nlogn),空间复杂度:O(1) 2.哈希表 从头到尾扫描数组,每扫描到一个数字,判断该数字是否在哈希表中,如果该哈希表还没有这个数字,那么加入哈希…
题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 这道题的简单版本是除了一个数字之外,其他数字都出现了两次,这个很简单,将所有的数异或一遍就得到了那个数字. 如果不考虑空间复杂度的话,通过hash表统计的方法可以得到这两个数字:但如果空间复杂度要求为O(1),还是得参考异或的方法. 很明显,如果将数组中所有的数都异或一遍,那么得到结果就是剩下两个数字的异或结果,因为这是两个不同的数字,因此异或结果不可能为0. 那么这个结果的二进制表示中…
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复的次数.请找出数组中任意一个重复的数字.例如如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 为此题目提供三种想法,但是只实现书上的一种方法 1.先将数组排序,然后扫描数组就很容易得到重复的数字 2.利用HashSet,遍历数组,如果set中不存在数组中的值就直接放入set,否则就是重复数字 3.我们注意到数组中的数字都在0…
问题描述 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 1: 输入:nums = [4,1,4,6] 输出:[1,6] 或 [6,1] 示例 2: 输入:nums = [1,2,10,4,1,4,3,3] 输出:[2,10] 或 [10,2]   限制: 2 <= nums <= 10000 代码 首先给一个时间复杂度\(O(N)\)空间复杂度\(O(N)\)的算法: class So…
问题描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例 1: 输入:nums = [3,4,3,3] 输出:4 示例 2: 输入:nums = [9,1,7,9,7,9,7] 输出:1   限制: 1 <= nums.length <= 10000 1 <= nums[i] < 2^31 代码 class Solution { public: int singleNumber(vector<int>&…