天行健君子以自强不息网站建设花钱做网站
目录
- 前言
 - 问题介绍
 - 解决方案
 - 代码编写
 - java语言版本
 - c语言版本
 - c++语言版本
 
- 思考感悟
 - 写在最后
 
前言
当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~
在此感谢左大神让我对算法有了新的感悟认识!
问题介绍
原问题
 给定二维数组arr,arr为排好序的数组,其中arr同时满足,从左到右递增,从上到下递增,给定一个数k,在尽可能少的时间内找到数k即可
 如:
 arr = [0125234744485779]\begin{bmatrix} 0 & 1 & 2 & 5 \\ 2 & 3 & 4 & 7 \\ 4 & 4 & 4 & 8 \\ 5 & 7 & 7 & 9 \end{bmatrix}0245134724475789
 k = 7
 结果:true
解决方案
原问题:
 假设arr为N*M的矩阵
 1、从右上角或者左下角开始,如果k < arr[N][0] ,说明k一定小于arr的第N行,行–
 2、如果k > arr[N][0] ,说明k一定大于arr的第0列,列++
 3、通过以上规则,查找到数后返回true,找不到并且越界后则退出循环,返回false
代码编写
java语言版本
原问题:
/*** 二轮测试:在排好序的矩阵中找数* @param arr* @param k* @return*/public static boolean isContainsCp1(int[][] arr, int k) {if (arr == null || arr.length == 0) {return false;}int row = arr.length - 1;int col = 0;while (row >= 0 && col <= arr[0].length - 1) {int cur = arr[row][col];if (cur == k) {return true;}else if (cur > k) {// 当前行不会存在krow--;}else {// 当前列不会存在kcol++;}}return false;}public static void main(String[] args) {System.out.println(isContainsCp1(new int[][]{{0,1,2,5},{2,3,4,7},{4,4,4,8},{5,7,7,9}}, 7));} 
c语言版本
正在学习中
c++语言版本
正在学习中
思考感悟
每一次的比较都能够至少排除一行或者一列,这个速度应该是比较快的了,如果大家有更好的办法记得评论区各显神通哦~
写在最后
方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可邮件给2260755767@qq.com
再次感谢左大神对我算法的指点迷津!
