package com.vv;
/**
* 题目描述:
* 1. 一个二维数组,每一行从左到右递增,每一列从上到下递增
* 2. 完成一个函数,输入这样的一个二维数组和一个数
* 3. 判断数组中是否含有这个数
*
* @author vv 2016.4.5
*
* 常见错误思路分析:
* 1. 选择比较数字的时候,犯了从数组中选择数字来进行比较
* 2. 这种选择,导致要查找的数字,不仅可能在两个区域中出现,而且区域还有重叠
* 3. 总的来说,就是剩下的查找区域非常不好,很不利于下次查找。
*
* 一种好的思路:
* 1. 遇到这类问题我觉得下次应该想到从特殊点来出发,找规律
* 2. 就像本题的点的选择,是在右上角或者左下角
* 3. 尝试比较过后,发现每次都会排除一行或者一列,下个比较点还是区域的右上角或者左下角
*
* ps:
* 本题是剑指offer第三题
* 没有参考源C答案代码,java实现。
*
*/
public class day1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] a = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 },
{ 6, 8, 11, 15 }, { 7, 12, 20, 50 } };
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
//测试用例
System.out.println(chazhao(a, 7));//true
System.out.println(chazhao(a, 50));//true
System.out.println(chazhao(a, 1));//true
System.out.println(chazhao(a, 60));//false
System.out.println(chazhao(a, 0));//false
System.out.println(chazhao(a, 39));//false
}
public static boolean chazhao(int[][] a, int x) {
// 从矩阵右上角开始
int raw = 0;
int col = a[0].length - 1;
// temp记录每次查找区域的右上角
int temp;
while (raw < a.length && col >= 0) {
temp = a[raw][col];
if (temp == x) {
return true;
} else if (temp > x) {
// 排除temp所在列
col--;
} else if (temp < x) {
// 排除temp所在行
raw++;
}
}
return false;
}
}
/**
* 题目描述:
* 1. 一个二维数组,每一行从左到右递增,每一列从上到下递增
* 2. 完成一个函数,输入这样的一个二维数组和一个数
* 3. 判断数组中是否含有这个数
*
* @author vv 2016.4.5
*
* 常见错误思路分析:
* 1. 选择比较数字的时候,犯了从数组中选择数字来进行比较
* 2. 这种选择,导致要查找的数字,不仅可能在两个区域中出现,而且区域还有重叠
* 3. 总的来说,就是剩下的查找区域非常不好,很不利于下次查找。
*
* 一种好的思路:
* 1. 遇到这类问题我觉得下次应该想到从特殊点来出发,找规律
* 2. 就像本题的点的选择,是在右上角或者左下角
* 3. 尝试比较过后,发现每次都会排除一行或者一列,下个比较点还是区域的右上角或者左下角
*
* ps:
* 本题是剑指offer第三题
* 没有参考源C答案代码,java实现。
*
*/
public class day1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] a = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 },
{ 6, 8, 11, 15 }, { 7, 12, 20, 50 } };
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
//测试用例
System.out.println(chazhao(a, 7));//true
System.out.println(chazhao(a, 50));//true
System.out.println(chazhao(a, 1));//true
System.out.println(chazhao(a, 60));//false
System.out.println(chazhao(a, 0));//false
System.out.println(chazhao(a, 39));//false
}
public static boolean chazhao(int[][] a, int x) {
// 从矩阵右上角开始
int raw = 0;
int col = a[0].length - 1;
// temp记录每次查找区域的右上角
int temp;
while (raw < a.length && col >= 0) {
temp = a[raw][col];
if (temp == x) {
return true;
} else if (temp > x) {
// 排除temp所在列
col--;
} else if (temp < x) {
// 排除temp所在行
raw++;
}
}
return false;
}
}