编程练习二维数组 java
2017-07-10 17:52
423 查看
来源:牛客网
题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
以上是我的版本,但是不是最优的,因为题中给出的是“每一列都按照从上到下递增的顺序排序”,说明可以用更好的办法
如下:
题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
public class Solution { private static final int CANNOT_FIND_FLAG=-1; /* 思路,先找出二维数组每一行第一个数字,与target比较, 如果比target大,那么就不参与比较,如果比target小,那么比较该行最后一个数字,如果比target小,那么不参与比较, 如果比target大,那么将这这行的序号记录在subArray中。 最终subArray中存储的这些行与target比较大小,使用二分法比较。 */ public boolean Find(int target, int [][] array) { //targetNum标记是否存在target值。 boolean targetNum=false; if(array.length>0){ //subArray,可能存在target的数组的所在行序号 int subArray[]=new int[array.length]; int subArrayIndex=0; //得到一系列可能存在target的行号,放入subArray中。 for(int i=0;i<array.length;i++){ if(array[i].length>0&&array[i][0]<=target){ if(array[i][(array[i].length-1)]>=target){ subArray[subArrayIndex]=i; subArrayIndex++; } } } //计算subArray中对应的每一行数据,看是否存在target。 for(int i=0;i<subArrayIndex;i++){ int arrayNum=subArray[i]; targetNum=findInArray(target,array[arrayNum]); //如果存在,直接返回true,不存在,继续查找。 if(targetNum==true)return true; } return targetNum; }else{ return false; } } /* 二分法比较每行数组与target大小,如果存在target一样大小的,返回true 如果不存在,返回false */ private boolean findInArray(int target,int [] array){ if(array.length<=0)return false; //二分法 if(array[array.length-1]!=target&&array[0]!=target){ int matchBegin=0; int matchEnd=array.length-1; int matchMid=0; while(matchBegin<=matchEnd){ matchMid=(matchBegin+matchEnd)/2; if(array[matchBegin]==target||array[matchEnd]==target){ return true; }else { if(matchMid==matchBegin||matchMid==matchEnd) return false; } if(array[matchMid]>target){ matchEnd=matchMid; }else if(array[matchMid]<target){ matchBegin=matchMid; }else{ return true; } } return false; }else{ return true; } } }
以上是我的版本,但是不是最优的,因为题中给出的是“每一列都按照从上到下递增的顺序排序”,说明可以用更好的办法
如下:
class Solution { public: bool Find(vector<vector<int> > array,int target) { int m,n,x,y; m = array.size();//行数 n = array[0].size();//列数 x=m-1;y=0;//坐标定在左下角 while(x>=0 && y<=n-1){ if(target<array[x][y]){ x--;//遇小上移 } else if(target>array[x][y]){ y++;//遇大右移 } else { return true; } } return false; } }; 左下角开始,遇大右移,遇小上移,直到超过边界都没找到,得false。否则得true。
相关文章推荐
- Java 编程思想(第4版)学习笔记(各种容器(集合框架)的比较 Collection Map ..第11章 练习4)
- 第2章 Java编程基础——FAQ2.25 如何实现一维和二维数组的遍历?
- Java基于TCP的Socket编程练习
- java例程练习(网络编程[简单双向通信试验])
- java例程练习(网络编程[简单双向通信试验])
- Java 编程思想(第4版)学习笔记(ArrayList 泛型 foreach 第11章练习1 hop())
- java例程练习(网络编程[简单UDP通信试验])
- java编程思想 第二章练习1
- 第6章_数组_编程练习_Exercise6_25(二维数组的相乘)
- java例程练习(网络编程[简单UDP通信试验])
- Java编程思想 第4版 练习题 / 第2章 一切都是对象 / 练习4
- Java编程思想 第4版 练习题 / 第2章 一切都是对象 / 练习11
- Java编程思想 第4版 练习题 / 第2章 一切都是对象 / 练习9
- Java 基础一些代码练习笔记(Array二维数组)
- Java编程思想 第4版 练习题 / 第22章 图形化用户界面 / 练习22
- Java 编程思想(第4版)学习笔记(迭代器 Iterator ListIterator 第11章练习11)
- Java编程思想 第4版 练习题 / 第2章 一切都是对象 / 练习8
- Java编程思想 第4版 练习题 / 第3章 操作符 / 练习2
- java例程练习(网络编程[简单网络连接试验])
- java例程练习(网络编程[简单UDP通信试验])